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