「RemoteIOでのオーディオ再生」でパラメータを設定する
このコードでチャンネル数やサンプリング周波数を変えようとしても変わってくれなかったのでいろいろと試してみたところ、EnableIOすると設定できた。以下そのまま貼り付け。
static const float kSampleRate = 22050.0; static const int kOutputBus = 0;
…
- (void)setupOutputUnit { OSStatus status; // Describe audio component AudioComponentDescription desc; desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_RemoteIO; desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; // Get component AudioComponent component = AudioComponentFindNext(NULL, &desc); // Get audio units status = AudioComponentInstanceNew(component, &outputUnit); // Enable playback UInt32 enableIO = 1; status = AudioUnitSetProperty(outputUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &enableIO, sizeof(UInt32)); // Apply format AudioStreamBasicDescription outputFormat; UInt32 size = sizeof(outputFormat); // Format preferred by the iphone (Fixed 8.24) outputFormat.mSampleRate = kSampleRate; // ←ここ outputFormat.mFormatID = kAudioFormatLinearPCM; outputFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical; outputFormat.mBytesPerPacket = sizeof(AudioUnitSampleType); outputFormat.mFramesPerPacket = 1; outputFormat.mBytesPerFrame = sizeof(AudioUnitSampleType); outputFormat.mChannelsPerFrame = 1; // ←ここ outputFormat.mBitsPerChannel = 8 * sizeof(AudioUnitSampleType); outputFormat.mReserved = 0; status = AudioUnitSetProperty(outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &outputFormat, size); // コールバックを設定 AURenderCallbackStruct callback; callback.inputProc = OutputCallback; callback.inputProcRefCon = self; size = sizeof(outputFormat); status = AudioUnitSetProperty(outputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, kOutputBus, &callback, sizeof(AURenderCallbackStruct)); status = AudioUnitInitialize(outputUnit); status = AudioOutputUnitStart(outputUnit); // 設定を取得 AudioUnitGetProperty(outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputFormat, &size); NSLog(@"samplerate = %f", outputFormat.mSampleRate); NSLog(@"bits = %u", outputFormat.mBitsPerChannel); NSLog(@"channels = %u", outputFormat.mChannelsPerFrame); }
関連記事