我創建了一個連接到AUGraph的簡單波形發生器。我重用了來自蘋果的一些示例代碼來設置AudioStreamBasicDescription這樣iOS波形發生器通過AUGraph連接
void SetCanonical(UInt32 nChannels, bool interleaved)
// note: leaves sample rate untouched
{
mFormatID = kAudioFormatLinearPCM;
int sampleSize = SizeOf32(AudioSampleType);
mFormatFlags = kAudioFormatFlagsCanonical;
mBitsPerChannel = 8 * sampleSize;
mChannelsPerFrame = nChannels;
mFramesPerPacket = 1;
if (interleaved)
mBytesPerPacket = mBytesPerFrame = nChannels * sampleSize;
else {
mBytesPerPacket = mBytesPerFrame = sampleSize;
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
}
在我的課堂我調用這個函數
mClientFormat.SetCanonical(2, true);
mClientFormat.mSampleRate = kSampleRate;
而採樣率是
#define kSampleRate 44100.0f;
其他的設置採取來自示例代碼以及
// output unit
CAComponentDescription output_desc(kAudioUnitType_Output, kAudioUnitSubType_RemoteIO, kAudioUnitManufacturer_Apple);
// iPodEQ unit
CAComponentDescription eq_desc(kAudioUnitType_Effect, kAudioUnitSubType_AUiPodEQ, kAudioUnitManufacturer_Apple);
// multichannel mixer unit
CAComponentDescription mixer_desc(kAudioUnitType_Mixer, kAudioUnitSubType_MultiChannelMixer, kAudioUnitManufacturer_Apple);
一切工作正常,但問題是,我沒有得到立體聲和我的回調函數失敗(壞訪問)當我試圖達到第二緩衝
Float32 *bufferLeft = (Float32 *)ioData->mBuffers[0].mData;
Float32 *bufferRight = (Float32 *)ioData->mBuffers[1].mData;
// Generate the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++)
{
switch (generator.soundType) {
case 0: //Sine
bufferLeft[frame] = sinf(thetaLeft) * amplitude;
bufferRight[frame] = sinf(thetaRight) * amplitude;
break;
這樣看來我得到單代替的立體聲。指針bufferRight是空的,但不知道爲什麼。 任何幫助將不勝感激。
只是巧合我在瀏覽器中打開了這兩個選項卡:[SCWaveformView](https://github.com/rFlex/SCWaveformView)。也許別人偶然發現了你的問題,只想把一個工作波形圖作爲一個庫;) – 2014-02-08 13:12:08