2015-02-06 53 views
0

我有这段代码从AudioFileID读取数据到缓冲区。当我在我的方法是这样当我不使用局部变量时,为什么会出现EXC BAD ACCESS?

EDCAudioFile *file = vc.file; 
OSStatus err = AudioFileReadPacketData(file.audioFile, NO, &numBytesReadFromFile, vc.mPacketDescs, file.currentPacket, &numPackets, buffer->mAudioData); 

EDCAudioFile声明一个局部变量

- (void)handle:(void *)aqData audioQueue:(AudioQueueRef) audioQueue buffer:(AudioQueueBufferRef) buffer 
{ 
TestViewController *vc = (__bridge TestViewController *)aqData; 

EDCAudioFile *file = vc.file; 
UInt32 numPackets = file.numberOfPacketsToRead; 
UInt32 numBytesReadFromFile; 

OSStatus err = AudioFileReadPacketData(file.audioFile, NO, &numBytesReadFromFile, vc.mPacketDescs, file.currentPacket, &numPackets, buffer->mAudioData); 

一切正常,是包含这样AudioFileID的属性的类:

@property (nonatomic, assign) AudioFileID audioFile; 

但是,当我将其更改为

OSStatus err = AudioFileReadPacketData(vc.file.audioFile, NO, &numBytesReadFromFile, vc.mPacketDescs, file.currentPacket, &numPackets, buffer->mAudioData); 

而VC包含此属性

@property (nonatomic, strong) EDCAudioFile *file; 

它EXC错误访问线程1地址为0x4崩溃。当我从模态视图控制器中选择一首歌曲并且该方法创建一个包含16个缓冲区的音频队列并用音频数据填充音频数据时,这种方法就是这样调用的。

for (int i=0; i < 16; i++) { 
    AudioQueueAllocateBuffer(self.mQueue, file.bufferByteSize, &_mBuffers[i]); 
    handleOutputBuffer((__bridge void*) self, self.mQueue, _mBuffers[i]); 
} 

... 

static void handleOutputBuffer (void *aqData, AudioQueueRef audioQueue, AudioQueueBufferRef buffer) 
{ 
    TestViewController *vc = (__bridge TestViewController *)aqData; 
    [vc handle:aqData audioQueue:audioQueue buffer:buffer]; 
} 

它确实崩溃时,我= 1,对于I = 0 OSStatus报告错误与此代码:2003334207

NSZombie告诉任何操作,该代码甚至不上我的IPhone 5,但是,我崩溃小型平板电脑。方法在主线程上调用。

正如我所说的第一块代码一切都很好,我可以在我的iPhone和iPad上播放音乐。

我很感激我能得到的每一个帮助。

哦,这里是我的堆栈跟踪: stack trace

这背后的原因是,我跟着这个苹果直营店Audio Queue Guide 播放音频,现在我想尝试使其更加面向对象通过创建一个类包含Apple自从为此使用结构体以来所需的全部信息。

+0

是你的应用程序的多线程? – nielsbot 2015-02-06 17:52:18

+0

是的,但是这个代码的执行应该只在主线程上执行。当我的音频开始播放时,会调用一个在后台线程上执行的回调。此回调填充缓冲区,但在播放任何游戏之前,我的代码已经崩溃。 – Duc 2015-02-06 18:55:57

+0

尝试使用警卫malloc – nielsbot 2015-02-07 19:55:15

回答

0

我刚刚得到它固定,通过改变这一行

- (void)handle:(void *)aqData audioQueue:(AudioQueueRef) audioQueue buffer:(AudioQueueBufferRef) buffer 

这个

- (void)handle:(TestViewController *)aqData audioQueue:(AudioQueueRef) audioQueue buffer:(AudioQueueBufferRef) buffer 
{ 
    UInt32 numBytesReadFromFile; 
    UInt32 numPackets = vc.file.numberOfPacketsToRead; 

    AudioFileReadPacketData(vc.file.audioFile, NO, &numBytesReadFromFile, vc.packetDescs, vc.file.currentPacket, &numPackets, buffer->mAudioData); 
相关问题