Возможно, самый простой способ - создать буферы, в которых хранится тишина необходимой длины, и поставить их в очередь соответствующим образом.Вам просто нужно сделать массив, полный нулей, основанный на частоте дискретизации и желаемой длине тишины, и передать его в буфер.
Если вы хотите, чтобы все было сложнее, вы не можете поставить в очередь всеиз буферов.Вы ставите в очередь тот, который должен играть прямо сейчас, и устанавливаете таймер, когда это будет сделано (и количество времени молчания также прошло).Затем вы можете поставить в очередь следующий буфер.Или вы можете опросить источник, чтобы узнать, остановился ли он, и когда это произойдет, начните отсчитывать время молчания.Вы также можете использовать функцию потоковой передачи ...
Редактировать: Это сработало для меня.Частота дискретизации должна быть такой же, как и у других буферов, находящихся в очереди на вашем источнике.Вы также можете иметь буфер длины «наибольший общий знаменатель» и просто поставить его в очередь несколько раз.
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);