使用内核中断在alsa中发出声音

时间:2013-11-07 20:45:11

标签: c audio interrupt alsa

嗨,我正在为我的大学建立一个实验室,我正在尝试使用Alsa软件为1循环中的中断数量发出声音。存储在Alsa缓冲区上的值大多类似于0,1,2偶尔为4或5(我计算循环之间中断的差异)。我找到了一个产生正弦波的程序,并发出连续的蜂鸣声,我想把那波变成一波中断,有人可以帮忙吗?

在第一段代码中,我试图让alsa在中断为!= 0时发出声音,或者如果中断为== 0则不发出任何声音。

int playback_callback (snd_pcm_sframes_t nframes)
{
    static float t = 0;
    int err;
    unsigned long long ti = 0, ti1 = 0, diff = 0,secs = 0;

    ti = ti1 = num_interrupts();

    printf ("playback callback called with %lu frames\n", nframes);

    for(int i = 0; i < BUFSIZE; ++i) {
       /*num_interrupts: function to calculate interrupts on /proc/interrupts*/
       ti = num_interrupts();
       diff = ti-ti1;
       ti1 = ti;
       /*printf("diff%llu\n",diff);*/
       if(diff != 0) {
           buf[i] = 65535;
       } else {
           buf[i] = 0;          
       }
    }
    if ((err = snd_pcm_writei (playback_handle, buf, nframes)) < 0) {
        fprintf (stderr, "write failed (%s)\n", snd_strerror (err));
    }

    return err;
}

1 个答案:

答案 0 :(得分:0)

人耳听不到个别样本;它听到频率

您应该生成一个正弦波(或多个),并根据中断率调整其音量和/或频率。

请注意,不能听到非常快速的变化;你应该检查每3000个样本中的中断号码。