Я написал небольшую звуковую библиотеку с PortAudio в Linux. Это для маленькой игры, поэтому есть много маленьких звуков, когда происходят разные вещи. Я открываю поток для каждого wav-файла для воспроизведения, вызывая Pa_OpenStream(). В linux этот вызов занимает в среднем около 10 мс. Однако в Windows это обычно занимает от 40 до 70 мс. И что еще хуже, первый вызов занимает 1,3 секунды. Затем по истечении этого времени он снова займет 1,3 секунды. Я не смог найти ничего последовательного в том, почему он висит, за исключением того, что это происходит каждый первый звонок. Окно на самом деле отлично работает на Wine.Как эффективно использовать PortAudio Pa_OpenStream() в Windows?
Я предполагаю, что это связано с различиями в базовом звуковом API, используемом в разных системах. Но, как ни странно, я нигде не нашел никакой информации, несмотря на обширный поиск.
Вот моя игра функция:
int play(const char * sN)
{
float threshold = .01f;
char * soundName = (char*)sN;
float g = glfwGetTime();
updatePlayer();
float g2 = glfwGetTime();
if (g2-g > threshold) printf("updatePlayer: %f/", g2 - g);
if (!paused && (int)streams.size() < maxStreams && !mute)
{
streamStr * ss = new streamStr;
g = glfwGetTime();
if (g-g2 > threshold) printf("new stream: %f/", g - g2);
PaError err;
sfData * sdata = getData(soundName);
ss->sfd = sdata;
g2 = glfwGetTime();
if (g2-g > threshold)printf("getData: %f/", g2 - g);
err = Pa_OpenStream(&(ss->stream), 0, &sdata->outputParameters, sdata->sfInfo.samplerate, paFramesPerBufferUnspecified, paNoFlag, PaCallback, ss);
if (err)
{
printf("PortAudio error opening output: %s\n", Pa_GetErrorText(err));
delete ss;
return 1;
}
g = glfwGetTime();
if (g-g2 > threshold)
printf("Pa_OpenStream: %f/", g - g2);
Pa_StartStream(ss->stream);
g2 = glfwGetTime();
if (g2-g > threshold)printf("Pa_StartStream: %f/", g2 - g);
addStreams(ss);
g = glfwGetTime();
if (g-g2 > threshold)printf("addStreams: %f", g - g2);
//Pa_SetStreamFinishedCallback(ss, finishedCallback);
printf("\n");
}
return 0;
}
Интересно, спасибо. В этом есть смысл. Я посмотрю дальше и уточню свои выводы. –
Другой вариант - открыть поток во время инициализации, как было предложено, а затем запустить и остановить поток при воспроизведении звука. Преимуществом этого подхода будет возможность для потока получить резервные копии с данными молчания, которые вы передаете ему (добавлена латентность). Недостатком является латентность, возникающая потоком потока PortAudio создает, когда поток запущен и остановлен. – trukvl
Я никогда не обращал внимания на то, сколько времени требуется для открытия потока, хотя я скажу, что заметил, что приложения могут запускаться в Windows довольно необычно долго. Я должен буду заметить в будущем. – trukvl