「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);
}

関連記事