どうもです〜。ゆ〜すけしゃ〜ぷないんすです。
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なので、音は出ません。実際は、計算した結果を渡していますが、
そこはそこで、また説明が必要なので後ほど。
以上、書いてみました。
とりあえず、音を出す下準備の部分だけですけど。
ではでは。続きはまたあとで。