0

我正在用 ALSA 在 Reapberry Pi 上编写一个“播放声音”程序。

我每 1280 个样本调用一次 snd_pcm_writei。

我想加一个小LED,让它“声音越大越亮,声音越小越暗”。

我的飞机是,如果每隔很短的时间段(例如:100ms)有一个回调,我可以在回调中获得瞬时音量,我可以控制其中的 LED。

在android中,有AudioTrack.setPositionNotificationPeriod。但是,我不知道如何在带有 ALSA 的 Linux 下做到这一点。

谁能给我一些建议?

播放功能如下所示:

// nLeftFrameSize: Total sample number.
// hDevice: Play device handle (initialized beforehand).
// lpbyBuffer: Sample buffer.

while(nLeftFrameSize > 0){
    nRes = (int)snd_pcm_writei(( snd_pcm_t*)hDevice, lpbyBuffer, 1280);
    nLeftFrameSize -= 1280;
}

我尝试在 snd_pcm_writei() 之前的 while 循环中计算 RMS,设置 LED 亮度和睡眠,以确保在播放这 1280 个样本时 LED 可以亮起。但这会导致声音不连续。

所以我会为 LED 控件创建另一个线程,我可以在该线程中休眠而不会影响播放。

4

0 回答 0