2012-09-26 61 views
0

我正在從以AudioQueueGetProperty呼叫的-50(一般參數錯誤)。請幫助我,因爲我已經觸摸了XCode和任何iPhone工作了幾個月。這可能是一個簡單的代表,但我無法解決它。我的代碼導致-50:一般參數錯誤檢索記錄格式與AudioQueueGetProperty

//Setup format 
AudioStreamBasicDescription recordFormat; 
memset(&recordFormat, 0, sizeof(recordFormat)); 
recordFormat.mFormatID = kAudioFormatMPEG4AAC; 
recordFormat.mChannelsPerFrame = 2; 
CCGetDefaultInputDeviceSampleRate(&recordFormat.mSampleRate); 
UInt32 propSize = sizeof(recordFormat); 
AQ(AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, 
            &propSize, &recordFormat), 
      "AudioFormatGetProperty throws unexpected errors."); 

//Setup Queue 
//listing 4.8-4.9 
AudioQueueRef theQueue = {0}; 
self->queue = theQueue; 
AQ(AudioQueueNewInput(&recordFormat, CCAudioRecordingCallback, 
           self, NULL, NULL, 0, &self->queue), 
      "AudioQueueNewInput throws unexpected errors."); 
UInt32 size = sizeof(recordFormat); 
AQ(AudioQueueGetProperty(self->queue, 
           kAudioConverterCurrentOutputStreamDescription, 
           &recordFormat, 
           &size), 
      "Getting audio property kAudioConverterCurrentOutputStreamDescription throws unexpected errors."); 

我覈實,我有一個有效的隊列,就像我打這個電話給AudioQueueGetProperty。我已經嘗試了通過隊列「self> queue」和「self.queue」的兩種方式,它們都導致相同的錯誤。隊列的定義如下:

@interface CCAudioRecorder() 
//... 
@property (nonatomic, assign) AudioQueueRef queue; 
//... 

@end 

@implementation CCAudioRecorder 
@synthesize queue; 

AQ是#def:

#define AQ(expr, msg) if(nil!=CheckError((expr), msg)) [NSException raise:@"AudioException" format:@"Unexpected exception occured."]; 

解析爲以下錯誤檢查功能:

static NSString* CheckError(OSStatus error, const char* operation) 
{ 
    if (noErr == error) return nil; 

    NSString *errorMessage = nil; 
    char errorString[20]; 
    //See if it appears to be a 4-char code 
    *(UInt32 *)(errorString+1) = CFSwapInt32HostToBig(error); 
    if (isprint(errorString[1]) && isprint(errorString[2]) 
     && isprint(errorString[3]) && isprint(errorString[4])) 
    { 
     errorString[0] = errorString[5] = '\''; 
     errorString[6] = '\0'; 
    } else { 
     sprintf(errorString, "%d", (int)error); 
    } 
    errorMessage = [NSString stringWithFormat: 
        @"Audio Error: %@ (%@)\n", 
        [NSString stringWithUTF8String:operation], 
        [NSString stringWithUTF8String:errorString]]; 
    NSLog(@"%@", errorMessage); 
    return errorMessage; 
} 

我也打過電話AudioFormatGetProperty與局部變量創建隊列,避免了類實例級伊娃,仍然得到了同樣的錯誤:

AudioQueueRef theQueue = {0}; 
AQ(AudioQueueNewInput(&recordFormat, CCAudioRecordingCallback, 
           self, NULL, NULL, 0, &theQueue), 
      "AudioQueueNewInput throws unexpected errors."); 
UInt32 size = sizeof(recordFormat); 
AQ(AudioQueueGetProperty(theQueue, 
           kAudioConverterCurrentOutputStreamDescription, 
           &recordFormat, 
           &size), 
      "Getting audio property kAudioConverterCurrentOutputStreamDescription throws unexpected errors."); 

** **更新我 有以下代碼,在模擬器上,而不是在設備上工作。 (我還不能跨我早些時候發佈的引用,但我相信這是類似的或準確。)

AudioQueueRef theQueue = {0}; 
self->queue = theQueue; 
AQ(AudioQueueNewInput(&recordFormat, CCAudioRecordingCallback, 
           self, NULL, NULL, 0, &self->queue), 
      "AudioQueueNewInput throws unexpected errors."); 
UInt32 size = sizeof(recordFormat); 
AQ(AudioQueueGetProperty(self->queue, 
           kAudioConverterCurrentOutputStreamDescription, 
           &recordFormat, 
           &size), 
      "Getting audio property kAudioConverterCurrentOutputStreamDescription throws unexpected errors."); 

運行它在設備上我得到在同一地點發生碰撞,錯誤-50一般參數錯誤。我的設備是運行iOS6的iPhone 4S,我正在使用XCode 4.5。

回答

1

您正在關注從learning core audio書右邊的代碼?關於實現記錄器的第4章?我注意到你的代碼和書中的代碼之間的差異,在書中,他們簡單地初始化隊列並把它作爲是:

AudioQueueRef queue = {0}; 
UInt32 size = sizeof(recordFormat); 
CheckError(AudioQueueGetProperty(queue, kAudioConverterCurrentOutputStreamDescription, 
           &recordFormat, &size), "couldn't get queue's format"); 

我不知道爲什麼你在混合扔self。但是,這絕對是導致你的錯誤。如果全部失敗,只需下載該章節的完整代碼here,並查看哪裏可以識別您的錯誤。

+0

你有我! :)是的,我正在學習核心音頻,我在那裏投入自我,以此作爲在其他方法中使用的將iVar中的隊列緩存的方法。我正在嘗試使用更多的O/O風格來實現音頻播放器對象。 – Cliff

+0

我更新了我的帖子,試圖直接使用本地隊列,但仍然出現錯誤。我必須錯過一些東西,或者這一切都改變了iOS6?我還沒有閱讀iOS6上的文檔,但我最近更新了我的SDK和硬件。 – Cliff

+0

剛剛更新了我的文章。我可以在模擬器上工作,但它在設備上崩潰。 – Cliff