gpt4 book ai didi

iphone - 从 Springboard 返回后导致普遍跳过的 AudioUnits

转载 作者:行者123 更新时间:2023-11-29 13:48:31 27 4
gpt4 key购买 nike

我在使用 AudioUnit 的应用程序中遇到问题。所有应用程序音频(包括未通过 AudioUnits 播放的音频)将在退出到 Springboard 并返回到应用程序后开始跳过。

我将问题分解到一个新的单独测试应用程序中。以下是重复它的步骤:

  • 开始使用一个音频文件播放AVAudioPlayer.
  • 创建、删除,然后再次创建音频单元
  • 退出跳板
  • 返回应用
  • 来自 AvAudioPlayer 的音频将开始跳过

这是我使用的一些代码:

- (IBAction)restartAudioUnit {

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

}

请原谅冗长的代码转储,但 AudioUnit 很复杂,我相当确定我只是错误地设置或删除了它们。

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, 0, &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, 0, &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, 0, &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 上做错了什么,那将非常有帮助。

编辑:上传完整的源代码。 Here

  1. 按播放声音(可能需要耳机)
  2. 按 RestartAudioUnit
  3. 返回跳板
  4. 重新进入 TestAudioUnit 应用

音频将跳过

最佳答案

当应用程序重新初始化时,您正在调用 AudioUnitInitialize(),这是不好的。您只需在应用启动时调用一次 AudioUnitInitialize(),并且您不必在每次应用进入前台时都构建整个 AU 图。

关于iphone - 从 Springboard 返回后导致普遍跳过的 AudioUnits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6130443/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com