, поэтому я использую образец кода Apple MixerHost , чтобы выполнить базовую настройку аудиографа для синтеза стереозвука. У меня есть некоторые проблемы с выяснением, как я должен заполнить буферный срез. В частности, я получаю звук только в левом канале, правый канал молчит:
AudioUnitSampleType *buffer = (AudioUnitSampleType *)ioData->mBuffers[0].mData;
SInt16 sampleValue;
for(UInt32 i = 0; i < inNumberFrames; i++)
{
sampleValue = sinf(inc) * 32767.0f; // generate sine signal
inc += .08;
buffer[i] = sampleValue;
}
if(inc > 2e10) inc -= 2e10;
Это воспроизводит синусоидальную волну на левом канале ... Вид высоты тона меняется каждые 10 секунд или около того, еще один индикатор того, что я делаю это неправильно:]
Я пробовал другие способы пройти через массив. это производило интересные звуки, которые были далеки от синусоидального сигнала. В какой-то момент у меня был глючный / прерывистый вывод на обоих каналах, что было отчасти как успех.
Если я проверяю структуру AudioBuffer, она подтверждает, что есть 2 канала, а размер байта на кадр равен 4. Итак, на кадр, есть два SInt16, верно? Один для левого, а другой для правого канала ... и они должны чередоваться?
Обратите внимание, что я использую формат потока, который отличается от примера Apple, потому что я не знаю математики с фиксированной точкой.
Формат потока настроен так:
size_t bytesPerSample = sizeof (AudioUnitSampleType);
stereoStreamFormat.mFormatID = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
stereoStreamFormat.mBytesPerPacket = bytesPerSample;
stereoStreamFormat.mFramesPerPacket = 1;
stereoStreamFormat.mBytesPerFrame = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame = 2;
stereoStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate = graphSampleRate;
Итак, мой вопрос: как мне заполнить стерео буфер, который настроен, как указано выше, данными, чтобы он просто работал?
спасибо!