Воспроизведение звуков синхронно с помощью snd_pcm_writei - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно воспроизводить звуки при определенных событиях, и я хочу минимизировать нагрузку на процессор, потому что также выполняется некоторая обработка изображений и производительность процессора ограничена.

В настоящее время я играю только один звук в время, и я делаю это следующим образом:

  • При запуске программы звуки считываются из 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 может использовать звуковые аппаратные ресурсы, освобождая таким образом основной процессор.

Я был бы благодарен за любые подсказки о том, как продолжить.

...