从Springboard返回后,AudioUnit导致通用跳过

如何解决从Springboard返回后,AudioUnit导致通用跳过

| 我在使用AudioUnits的应用程序中遇到问题。在退出Springboard并返回到应用程序之后,所有应用程序音频(包括未通过AudioUnits播放的音频)将开始跳过。 我将问题分解成一个新的单独的测试应用程序。以下是重复此步骤的步骤: 使用开始播放音频文件 AVAudioPlayer。 创建,删除,然后再次创建 音频单元 退出跳板 返回应用 来自AvAudioPlayer的音频将开始跳过 这是我使用的一些代码
- (IBAction)restartAudioUnit {

    MySoundStream* audioUnitClass;
    audioUnitClass = Load();
    [audioUnitClass release];
    audioUnitClass = Load();

}
原谅冗长的代码转储,但是AudioUnits很复杂,我敢肯定我只是在设置它们或错误地将它们取下。 MySoundStream类:
Osstatus UnitRenderCB(void* pRefCon,AudioUnitRenderActionFlags* flags,const AudioTimeStamP* timeStamp,UInt32 busNum,UInt32 numFrames,audiobufferlist*  pData){

    Osstatus tErr = noErr;

    //Do nothing

    return tErr;
}

@implementation MySoundStream

-(void) dealloc {

    [self Unload];

    [super dealloc];
}

-(void) Unload {

    Osstatus tErr = noErr; 
    tErr = AudioUnitUninitialize(OutUnit);
}

@end

MySoundStream* Load()
{
    Osstatus tErr = noErr;
    AudioComponentInstance tRIO;
    AudioComponentDescription tRIOCD;
    AURenderCallbackStruct tRIOCB;
    AudioStreamBasicDescription tAUF;

    tRIOCD.componentType = kAudioUnitType_Output;
    tRIOCD.componentSubType = kAudioUnitSubType_RemoteIO;
    tRIOCD.componentManufacturer = kAudioUnitManufacturer_Apple;
    tRIOCD.componentFlags = 0;
    tRIOCD.componentFlagsMask = 0;

    AudioComponent tRIOC = AudioComponentFindNext(NULL,&tRIOCD);
    tErr = AudioComponentInstanceNew(tRIOC,&tRIO);
    if (tErr != noErr) return NULL;

    int tOutEnable = 1;

    tErr = AudioUnitSetProperty(tRIO,kAudioOutputUnitProperty_EnableIO,kAudioUnitScope_Output,&tOutEnable,sizeof(tOutEnable));
    if (tErr != noErr) return NULL; 

    tAUF.mSampleRate = 44100.00;
    tAUF.mFormatID = kAudioFormatLinearPCM;
    tAUF.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    tAUF.mFramesPerPacket = 1;
    tAUF.mChannelsPerFrame = 2;
    tAUF.mBitsPerChannel = 16;
    tAUF.mBytesPerPacket = 4;
    tAUF.mBytesPerFrame = 4;

    tErr = AudioUnitSetProperty(tRIO,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Input,&tAUF,sizeof(tAUF));
    if (tErr != noErr) return false;

    MySoundStream* pRet = [MySoundStream alloc];

    tRIOCB.inputProc = UnitRenderCB;
    tRIOCB.inputProcRefCon = pRet;
    tErr = AudioUnitSetProperty(tRIO,kAudioUnitProperty_SetRenderCallback,kAudioUnitScope_Global,&tRIOCB,sizeof(tRIOCB));
    if (tErr != noErr){ delete pRet; return NULL; }

    tErr = AudioUnitinitialize(tRIO);
    if (tErr != noErr){ delete pRet; return NULL; }

    pRet->OutUnit = tRIO;

    return pRet;
}
如果有人能看到我用此AudioUnit做错的事情,那对我很有帮助。 编辑: 上传完整的源代码。这里 按播放声音(可能需要耳机) 按RestartAudioUnit 返回跳板 重新输入TestAudioUnit应用 音频将跳过     

解决方法

重新初始化应用程序时,您正在呼叫
AudioUnitInitialize()
,这不好。您只需在应用启动时调用一次ѭ2once,并且不必每次应用进入前台时都构建整个AU图形。     ,切换到使用AUGraph设置我的音频单元路径,我的运气更好。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?