![](/img/trans.png)
[英]Is there an equivalent of Mac OS X “open” command that can be called from C++/Objective-C code?
[英]Prevent Objective-C object called from C++ code being released
這是我的情況:
我正在使用音頻隊列服務來錄制聲音。 當回調函數被調用時(緩沖區已滿),我將緩沖區內容發送到Objective-C對象進行處理。
void AQRecorder::MyInputBufferHandler(void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp * inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription* inPacketDesc)
{
AQRecorder *aqr = (AQRecorder *)inUserData;
try {
if (inNumPackets > 0) {
NSLog(@"Callback ! Sending buffer content ...");
aqr->objectiveC_Call([NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataBytesCapacity]);
aqr->mRecordPacket += inNumPackets;
}
if (aqr->IsRunning())
XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed");
} catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
}
void AQRecorder::objectiveC_Call(NSData *buffer) {
MyObjCObject *myObj = [[MyObjCObject alloc] init];
[myObj process:buffer];
}
這里的問題是我在處理過程中(通過myObj的處理方法)得到了EXC_BAD_ACCESS,經過一番研究后,我猜想它與myObj的發布有關。
MyObjCObject.process從緩沖區內容執行for循環,即使我僅對緩沖區值執行NSLog也會收到EXC_BAD_ACCESS錯誤。
-(void)run:(NSData *)bufferReceived {
NSUInteger bufferSize = [bufferReceived length];
self.buffer = (short *)malloc(bufferSize);
memcpy(self.buffer, [bufferReceived bytes], bufferSize);
for(int i= 0; i < bufferSize; i++) {
NSLog("value: %i", buffer[i]);
}
}
你能告訴我這樣做的方法嗎?
ps:我的文件擴展名為.mm ,在整個項目中都啟用了ARC,我的其余代碼似乎按預期工作。
謝謝 !
您分配了緩沖區並強制轉換為'(short *)',但是隨后使用'bufferSize'(字節數)枚舉了緩沖區。 這意味着“ for”循環最終將嘗試讀取緩沖區的末尾,從而可能導致“ EXE_BAD_ACCESS”。 那是因為每次迭代都以“短”而不是“字節”前進。 您應該將循環更改為:
for(int i= 0; i < bufferSize / sizeof(short); i++) {
NSLog("value: %i", buffer[i]);
}
要么更改“緩沖區”成員變量的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.