2015-02-06 44 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); 
相關問題