Я пытаюсь захватить входной поток данных на выходной блок в звуковом графике, чтобы я мог записать его в файл. Я зарегистрировал функцию обратного вызова для ввода выходного блока (выход по умолчанию) после создания графа как так:Функция обратного вызова блока вывода аудиографа - не может читать данные
AudioComponent comp = AudioComponentFindNext (NULL, &cd);
if (comp == NULL) {
printf ("can't get output unit");
exit (-1);
}
CheckError (AudioComponentInstanceNew(comp, &player->outputUnit),
"Couldn't open component for outputUnit"); // outputUnit is of type AudioUnit
// register render callback
AURenderCallbackStruct input;
input.inputProc = MyRenderProc;
input.inputProcRefCon = player;
CheckError(AudioUnitSetProperty(player->outputUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
0,
&input,
sizeof(input)),
"AudioUnitSetProperty failed");
// initialize unit
CheckError (AudioUnitInitialize(player->outputUnit),"Couldn't initialize output unit");
Функция обратного вызова вызывается, но когда я пытаюсь прочитать поток входных данных от ioData-> mBuffers [ 0] .mData, все, что я получаю, это нули. Вот функция обратного вызова:
OSStatus MyRenderProc(void *inRefCon, // PLAYER CODE
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData) {
int frame = 0;
Float32 leftFloat = 0;
Float32 rightFloat = 0;
NSNumber *leftNumber;
NSNumber *rightNumber;
for (frame = 0; frame < inNumberFrames; ++frame)
{
Float32 *data = (Float32*)ioData->mBuffers[0].mData;
leftFloat = (data)[frame];
leftNumber = [NSNumber numberWithDouble:leftFloat];
(data)[frame] = 0;
// copy to right channel too
data = (Float32*)ioData->mBuffers[1].mData;
rightFloat = (data)[frame];
rightNumber = [NSNumber numberWithDouble:(data)[frame]];
(data)[frame] = 0;
[leftData addObject:leftNumber];
[rightData addObject:rightNumber];
}
return noErr;
}
Кроме того, если я не обнулять данные, которые я слышу шум во время воспроизведения, который говорит мне, что я искажая функцию mBuffers. Что я здесь делаю неправильно?
Что делают массивы 'leftData' и' rightData'? Они не объявлены в фрагменте кода там. –
Вы должны либо отображать данные где-нибудь (ввод в вашем случае), либо заполнить буфер чем-то (нули в вашем случае). В остальном все, что осталось в буфере, будет продолжать играть (шум в вашем случае). – user3078414
Michael - leftData и rightData - объекты NSMutableArray, которые я использую только для быстрой доступности данных, чтобы увидеть, работает ли что-либо. –