Тишина между воспроизводимыми буферами в OpenAL? - PullRequest
0 голосов
/ 31 марта 2011

Я использую alSourceQueueBuffers для потоковой передачи буферов в источник звука AL.У меня есть буферы разного размера, которые нужно проигрывать один за другим.Пока все хорошо, однако, между каким-то буфером мне нужно переменное количество тишины, как я могу добавить это программно?

1 Ответ

1 голос
/ 31 марта 2011

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

Если вы хотите, чтобы все было сложнее, вы не можете поставить в очередь всеиз буферов.Вы ставите в очередь тот, который должен играть прямо сейчас, и устанавливаете таймер, когда это будет сделано (и количество времени молчания также прошло).Затем вы можете поставить в очередь следующий буфер.Или вы можете опросить источник, чтобы узнать, остановился ли он, и когда это произойдет, начните отсчитывать время молчания.Вы также можете использовать функцию потоковой передачи ...


Редактировать: Это сработало для меня.Частота дискретизации должна быть такой же, как и у других буферов, находящихся в очереди на вашем источнике.Вы также можете иметь буфер длины «наибольший общий знаменатель» и просто поставить его в очередь несколько раз.

int sampleRate=22050;
double sTime=2.5;     // How long to maintain silence.
int sampleCount= int(sTime*sampleRate);
int byteCount  = sampleCount*sizeof(short);
short* silence = (short*)malloc(byteCount);
memset(silence,0,byteCount);

alBufferData(silenceBuffer,AL_FORMAT_MONO16,silence,byteCount,sampleRate);
alSourceQueueBuffers(mySource,1,&silenceBuffer);

free(silence);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...