どうもです〜。ゆ〜すけしゃ〜ぷないんすです。

 

iOSで実装できたので、ちょっとやったことを書いてみますね。

 

いろいろ考えたのですが、あれこれまとめ出すと手間かかるので、

ソースを必要なところを抜粋して載せてみることにします。

 

ちなみに、Objective-Cです。

 

    AudioUnit _unit;
    AUGraph _graph;
    AUNode _node;

まず、変数の定義

 

    AudioComponentDescription acd;
    acd.componentType = kAudioUnitType_Output;
    acd.componentSubType = kAudioUnitSubType_RemoteIO;
    acd.componentManufacturer = kAudioUnitManufacturer_Apple;
    acd.componentFlags = 0;
    acd.componentFlagsMask = 0;

	NewAUGraph(&_graph);
    AUGraphAddNode(_graph, &acd, &_node);
    AUGraphOpen(_graph);

オーディオ出力の接続をコントロールできるように設定してる

 

    AURenderCallbackStruct st ={0};
    st.inputProc =  audio_callback;
    st.inputProcRefCon = (__bridge void * )self;
    
    AUGraphSetNodeInputCallback(_graph, _node, 0, &st);
    
    AUGraphNodeInfo(_graph, _node, NULL, &_unit);
    

再生データを定義するコールバック関数を定義。

再生前にaudio_callback関数がコールバックされ、再生データを設定できます。

 

    int frameBytes = 4;
    int chns = 2;
    AudioStreamBasicDescription streamFormat;
    streamFormat.mSampleRate = 44100;
    streamFormat.mFormatID = kAudioFormatLinearPCM;
    streamFormat.mFormatFlags =
    kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
    streamFormat.mBytesPerPacket = frameBytes;
    streamFormat.mFramesPerPacket = 1;
    streamFormat.mBytesPerFrame = frameBytes;
    streamFormat.mChannelsPerFrame = chns;
    streamFormat.mBitsPerChannel = frameBytes*8;
    
    
    AudioUnitSetProperty(_unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamFormat, sizeof(streamFormat));

再生フォーマットを設定。

ステレオ(チャンネル数2)、44100Hz、1フレームのバイト数4byteで設定。

 

	AUGraphInitialize(_graph);
    AUGraphStart(_graph);

スタート!

これで、コールバック関数が呼ばれるようになるので、データを渡せばその通り音を出してくれます。

 

OSStatus audio_callback(
                                   void                        *inRefCon,
                                   AudioUnitRenderActionFlags  *ioActionFlags,
                                   const AudioTimeStamp        *inTimeStamp,
                                   UInt32                      inBusNumber,
                                   UInt32                      inNumberFrames,
                                   AudioBufferList             *ioData
                                   ){
    Float32* b0 = (Float32*)ioData->mBuffers[0].mData;
    Float32* b1 = (Float32*)ioData->mBuffers[1].mData;
    for(UInt32 i = 0; i < inNumberFrames; i++){
        b0[i] = 0;//左のデータ
        b1[i] = 0;//右のデータ
    }
    return noErr;
}

コールバック関数はこんな感じ。

 

この設定だと0なので、音は出ません。実際は、計算した結果を渡していますが、

そこはそこで、また説明が必要なので後ほど。

 

以上、書いてみました。

とりあえず、音を出す下準備の部分だけですけど。

 

 

ではでは。続きはまたあとで。