Мне нужно воспроизводить звуки при определенных событиях, и я хочу минимизировать нагрузку на процессор, потому что также выполняется некоторая обработка изображений и производительность процессора ограничена.
В настоящее время я играю только один звук в время, и я делаю это следующим образом:
- При запуске программы звуки считываются из WAV-файлов, а необработанные данные PCM загружаются в память
- звуковое устройство открывается (snd_pcm_open () в режиме SND_PCM_NONBLOCK)
- запускается рабочий поток, который непрерывно вызывает snd_pcm_writei (), пока в него поступают данные (data-> оставаясь> 0).
Несколько возобновил, функция рабочего потока
static void *Thread_Func (void *arg)
{
thrdata_t *data = (thrdata_t *)arg;
snd_pcm_sframes_t res;
while (1)
{ pthread_mutex_lock (&lock);
if (data->shall_stop)
{ data->shall_stop = false;
snd_pcm_drop (data->pcm_device);
snd_pcm_prepare (data->pcm_device);
data->remaining = 0;
}
if (data->remaining > 0)
{ res = snd_pcm_writei (data->pcm_device, data->bufptr, data->remaining);
if (res == -EAGAIN) continue;
if (res < 0) // error
{ fprintf (stderr, "snd_pcm_writeX() error: %s\n", snd_strerror(result));
snd_pcm_recover (data->sub_device, res);
}
else // another chunk has been handed over to sound hw
{ data->bufptr += res * bytes_per_frame;
data->remaining -= res;
}
if (data->remaining == 0) snd_pcm_prepare (data->pcm_device);
}
pthread_mutex_unlock (&lock);
usleep (sleep_us); // processor relief
}
} // Thread_Func
Хорошо, так что это работает хорошо для одного звука за раз. Как играть в различные игры?
Я нашел dmix, но на уровне пользователя это похоже на инструмент для смешивания потоков, поступающих из отдельных программ.
Кроме того, я нашел простой интерфейс микшера в ALSA Project C Библиотечный интерфейс, без каких-либо подсказок, примеров или руководств о том, как использовать все эти функции, описанные одной строкой текста.
В качестве крайней меры я мог бы рассчитать среднее значение всех буферов для играть синхронно. До тех пор, пока я этого избегал, надеясь, что решение ALSA может использовать звуковые аппаратные ресурсы, освобождая таким образом основной процессор.
Я был бы благодарен за любые подсказки о том, как продолжить.