Так что я недавно изучил основные данные и до сих пор новичок. Мне трудно понять, какие данные я записываю и как это влияет на общий поток данных. Так что для некоторого фона у меня есть приложение, которое делает потоковое видео/аудио между телефонами с помощью webRTC. Тем не менее, я хочу проверить данные, которые вводятся в устройство через микрофон и данные, выводимые через динамик. Я посмотрел в AurioTouch демо и Core Audio и в настоящее время у меня есть это:Получение микрофонного входа и выхода динамиков с использованием Core Audio
- (void)setupIOUnit
{
// Create a new instance of AURemoteIO
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
AudioComponent comp = AudioComponentFindNext(NULL, &desc);
AudioComponentInstanceNew(comp, &rioUnit);
// Enable input and output on AURemoteIO
// Input is enabled on the input scope of the input element
// Output is enabled on the output scope of the output element
UInt32 one = 1;
AudioUnitSetProperty(rioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &one, sizeof(one));
AudioUnitSetProperty(rioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &one, sizeof(one));
// Set the MaximumFramesPerSlice property. This property is used to describe to an audio unit the maximum number
// of samples it will be asked to produce on any single given call to AudioUnitRender
UInt32 maxFramesPerSlice = 4096;
AudioUnitSetProperty(rioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &maxFramesPerSlice, sizeof(UInt32));
// Get the property value back from AURemoteIO. We are going to use this value to allocate buffers accordingly
UInt32 propSize = sizeof(UInt32);
AudioUnitGetProperty(rioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &maxFramesPerSlice, &propSize);
// Set the render callback on AURemoteIO
AURenderCallbackStruct renderCallback;
renderCallback.inputProc = performRender;
renderCallback.inputProcRefCon = NULL;
AudioUnitSetProperty(rioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &renderCallback, sizeof(renderCallback));
NSLog(@"render set now");
// Initialize the AURemoteIO instance
AudioUnitInitialize(rioUnit);
[self startIOUnit];
return;
}
- (OSStatus)startIOUnit
{
OSStatus err = AudioOutputUnitStart(rioUnit);
if (err) NSLog(@"couldn't start AURemoteIO: %d", (int)err);
return err;
}
Рендер функция обратного вызова
static OSStatus performRender (void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
OSStatus err = noErr;
// the data gets rendered here
err = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
if (ioData->mBuffers[0].mDataByteSize >= 12) {
NSData *myAudioData = [NSData dataWithBytes: ioData->mBuffers[0].mData length:12];
NSLog(@" playback's first 12 bytes: %@", myAudioData);
}
for (UInt32 i=0; i<ioData->mNumberBuffers; ++i) {
memset(ioData->mBuffers[i].mData, 0, ioData->mBuffers[i].mDataByteSize);
}
return err;
}
Это выводит некоторые данные, которые я не знаю, на данный момент, является ли это микрофон вход или выход динамика. Меня беспокоит то, что даже после очистки буфера ioData я все еще получаю звук на другом телефоне и могу воспроизводить звук, отправленный другим телефоном. Этот тип подсказывает мне, что я касаюсь ни микрофонного входа, ни выхода динамика.
Я видел некоторые различные параметры этой линии:
AudioUnitSetProperty(rioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &renderCallback, sizeof(renderCallback));
и мне интересно, если я просто это не так или что-то. Кроме того, есть эта строка:
err = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
под влиянием AudioUnitSetProperty? Что делает установка 1 в этом сценарии?
Любая помощь была бы замечательной. В идеале, я хочу иметь возможность проецировать выходные данные динамиков (возможно, в файл), а также вход микрофона.
Возможно, вы имели в виду Core Audio или Core Media вместо Core Data? – Razvan
Исправлено и сменили его на основной звук –