【发布时间】:2014-01-24 12:43:33
【问题描述】:
我创建了一个连接到 AUGraph 的简单波形发生器。我重用了 Apple 的一些示例代码来设置 AudioStreamBasicDescription 像这样
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。也许其他人偶然发现了您的问题,只是想要一个工作波形图作为库;)
标签: c++ iphone objective-c core-audio audiounit