首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过AUGraph连接的iOS波形发生器

问通过AUGraph连接的iOS波形发生器
EN

Stack Overflow用户
提问于 2014-01-24 20:43:33
回答 2查看 387关注 0票数 3

我已经创建了一个连接到AUGraph的简单波形发生器。我重用了苹果公司的一些示例代码来设置AudioStreamBasicDescription,如下所示

代码语言:javascript
复制
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;
    }
}

在我的类中,我调用这个函数

代码语言:javascript
复制
mClientFormat.SetCanonical(2, true);
mClientFormat.mSampleRate = kSampleRate;

而采样率是

代码语言:javascript
复制
#define kSampleRate     44100.0f;

其他设置也取自示例代码

代码语言:javascript
复制
// 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);

一切正常,但问题是,我没有得到立体声和我的回调函数失败(访问不良),当我试图到达第二个缓冲区

代码语言:javascript
复制
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为空,但不知道原因。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2014-02-08 13:45:19

我可以看到两个可能的错误。首先,正如@invalidname指出的那样,立体声录制可能不会在iPhone这样的单声道设备上工作。好吧,它可能会起作用,但如果它起作用了,你无论如何都会得到双单声道立体声流,所以为什么要费心呢?您也可以将流配置为单声道工作,这样就可以省去CPU开销。

第二个问题可能是声音失真的根源。您的流描述格式标志应为:

代码语言:javascript
复制
kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagsNativeEndian |
kAudioFormatFlagIsPacked

另外,不要忘记将mReserved标志设置为0。虽然这个标志的值可能会被忽略,但为了确保这一点,显式地将它设置为0并不会有什么坏处。

编辑:在iPhone上调试音频的另一个更通用的技巧--如果你有失真、剪辑或其他奇怪的效果,从你的手机中抓取数据负载,并在波形编辑器中查看录音。能够缩小并查看单个样本将为您提供许多关于哪里出了问题的线索。

要做到这一点,你需要打开“管理器”窗口,点击你的手机,然后展开你的应用程序旁边的小箭头(在你通常卸载它的地方)。现在你会看到一个向下的小箭头,如果你点击它,Xcode会将数据有效负载从你的应用程序复制到你硬盘上的某个地方。如果您要将录音转储到磁盘,您可以在此处找到解压缩的文件。

来自link的引用

票数 0
EN

Stack Overflow用户

发布于 2014-02-11 16:36:30

我猜问题是你指定了一个交错格式,但是在你的IO回调中访问缓冲区就好像它们是非交错的一样。ioData->mBuffers1无效,因为所有数据在ioData->mBuffers.mData中都是交错的。检查ioData->mNumberBuffers。我的猜测是它设置为1。另外,验证ioData->mBuffers.mNumberChannels是否设置为2,这将表示交错数据。

还可以查看Core Audio Public Utility类,以帮助您设置格式。让它变得容易多了。您用于设置格式的代码可以减少到一行,而且您会更有信心它是正确的(尽管在我看来,您的格式设置是正确的-如果您想要的是交错的16位整数):

代码语言:javascript
复制
CAStreamBasicDescription myFormat(44100.0, 2, CAStreamBasicDescription::kPCMFormatInt16, true)

苹果过去常常将这些类打包到与Xcode一起安装的SDK中,但现在您需要从以下位置下载它们:https://developer.apple.com/library/mac/samplecode/CoreAudioUtilityClasses/Introduction/Intro.html

无论如何,看起来对你来说最简单的修复方法就是将格式改为非交错格式。所以在你的代码中: mClientFormat.SetCanonical(2,false);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21333055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档