我创建了一个连接到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