Почему этот звуковой агрегат дистанционной инициализации работает на iPhone, но не в симуляторе?
-
25-09-2019 - |
Вопрос
Я использую службы аудиогрузни для настройки обратного вызова вывода рендеринга, поэтому я могу смешивать синтезированные звуки. У меня есть код, кажется, отлично работает на устройствах, которые у меня есть (iPod Touch, iPhone 3G и iPad), но не работает на симуляторе.
На симуляторе функция аудионитинициализации не удается и возвращает значение -10851 (kaudiouniterr_invalidpropertyValue в соответствии с документацией Apple).
Вот мой код инициализации. Кто-нибудь с большим опытом с этим API, чем я вижу все, что я делаю неверным здесь?
#define kOutputBus 0
#define kInputBus 1
...
static OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList* ioData)
{
// Mix audio here - but it never gets here on the simulator
return noErr;
}
...
{
OSStatus status;
// Describe audio component
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
// Get component
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
// Get audio units
status = AudioComponentInstanceNew(inputComponent, &m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to get audio component instance: %d", status);
}
// Enable IO for playback
UInt32 flag = 1;
status = AudioUnitSetProperty(m_audio_unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
kOutputBus,
&flag,
sizeof(flag));
if(status != noErr) {
NSLog(@"Failed to enable audio i/o for playback: %d", status);
}
// Describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 4;
audioFormat.mBytesPerFrame = 4;
// Apply format
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
if(status != noErr) {
NSLog(@"Failed to set format descriptor: %d", status);
}
// Set output callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = playbackCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
if(status != noErr) {
NSLog(@"Failed to set output callback: %d", status);
}
// Initialize (This is where it fails on the simulator)
status = AudioUnitInitialize(m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to initialise audio unit: %d", status);
}
}
Моя версия Xcode - 3.2.2 (64 бита) моя версия симулятора - 3.2 (хотя такая же проблема возникает в 3.1.3 Отладка или освобождение)
Спасибо, я ценю это!
Решение
Компиляция устройства и для симулятора полностью отличается. Самые распространенные вещи имеют одинаковый ожидаемый результат. Например, загрузка выключателя просмотра между ними играет звуки и так далее. Однако, когда дело доходит до других вещей, таких как воспроизведение звука с Openal Loading 10 буферов, а затем переключение между ними симулятор не может обрабатывать это, но устройства могут.
То, как я вижу, так как он работает на устройстве, это все, что я забочусь о. Попробуйте не подтянуть волосы, чтобы сделать приложение работать на симуляторе, когда он отлично работает на устройстве.
надеюсь, это поможет
Писать
Другие советы
Вы настраивали и включили аудиосессию перед вызовом кода инициализации дистанционного управления?
Когда вы устанавливаете свойства потока на входную шину, вы используете kOutputBus
для вашего входного применения. Это, вероятно, не хорошо. Кроме того, вам, вероятно, не нужно применить обратный вызов Render в глобальный объем, поскольку вам нужно только для вывода. Кроме того, я думаю, что ваши определения kOutputBus
а также kInputBus
Неправильно ... Когда я смотрю на рабочий аудио код iPhone, он использует 0 для шины ввода и 1 для вывода шины.
Я также могу подумать о нескольких незначительных вещах в отношении аудиоочистителя, хотя я не думаю, что они сделают большую часть разницы:
- Добавить
kAudioFormatFlagsNativeEndian
Свойство на ваши флаги формата - Явно установить
mReserved
поле до 0.