2013-09-22 32 views
0

我試圖用下面的代碼使用Core Audio生成方波。 AIFF文件不會生成任何我通過任何參數的任何內容。示例來自Kevin Avila的Learning Core Audio http://www.amazon.com/Learning-Core-Audio-Hands-On-Programming/dp/0321636848使用Core Audio生成方波

任何想法?請幫忙!

main.m看起來如下;

#import <Foundation/Foundation.h> 
#import <AudioToolbox/AudioToolbox.h> 
#define SAMPLE_RATE 44100 
#define DURATION 50.0 
#define FILENAME_FORMAT @"%0.3f-square.aif" 
int main (int argc, const char * argv[]) { 
@autoreleasepool { 
    if (argc < 2) { 
     printf ("Usage: CAToneFileGenerator n\n(where n is tone in Hz)"); 
     return -1; 
     } 
    double hz = atof(argv[1]); 
    assert (hz > 0); 
    NSLog (@"generating %f hz tone", hz); 
    NSString *fileName = [NSString stringWithFormat: FILENAME_FORMAT, hz]; 
    NSString *filePath = [[[NSFileManager defaultManager] currentDirectoryPath] 
          stringByAppendingPathComponent: fileName]; NSURL *fileURL = [NSURL fileURLWithPath: filePath]; 
    // Prepare the format 
    AudioStreamBasicDescription asbd; 
    memset(&asbd, 0, sizeof(asbd)); 
    asbd.mSampleRate = SAMPLE_RATE; 
    asbd.mFormatID = kAudioFormatLinearPCM; 
    asbd.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    asbd.mBitsPerChannel = 16; 
    asbd.mChannelsPerFrame = 1; 
    asbd.mFramesPerPacket = 1; 
    asbd.mBytesPerFrame = 2; asbd.mBytesPerPacket = 2; 
    // Set up the file 
    AudioFileID audioFile; 
    OSStatus audioErr = noErr; 
    audioErr = AudioFileCreateWithURL((__bridge CFURLRef)fileURL, 
             kAudioFileAIFFType, 
             &asbd, 
             kAudioFileFlags_EraseFile, 
             &audioFile); 
    assert (audioErr == noErr); 
    // Start writing samples 
    long maxSampleCount = SAMPLE_RATE; 
    long sampleCount = 0; 
    UInt32 bytesToWrite = 2; 
    double wavelengthInSamples = SAMPLE_RATE/hz; 
    while (sampleCount < maxSampleCount) { 
     for (int i=0; i<wavelengthInSamples; i++) { 
      // Square wave 
      SInt16 sample; 
      if (i < wavelengthInSamples/2) { 
       sample = CFSwapInt16HostToBig (SHRT_MAX); } else { 
        sample = CFSwapInt16HostToBig (SHRT_MIN); } 
      audioErr = AudioFileWriteBytes(audioFile, false, 
              sampleCount*2, &bytesToWrite, &sample); 
      assert (audioErr == noErr); sampleCount++; 
      audioErr = AudioFileClose(audioFile); assert (audioErr == noErr); 
      NSLog (@"wrote %ld samples", sampleCount); 
     } 
     return 0; 
    } 
} 

}

回答

1

很肯定你AudioFileClose()不應該是for循環中。在寫完所有的樣本後,這應該在循環之外。

請檢查可下載代碼the book's home page。我只是下載並運行它,它的工作方式與本書中描述的一樣(儘管由於它是爲Lion構建的,所以如果您使用的是Mountain Lion或Mavericks,則必須在項目設置中更新目標SDK)

- 克里斯(無效名稱)

+0

非常感謝。我發現了這個問題。原代碼運行良好。 xcode的版本是5,並且弧被設置爲是。當弧被設置爲否時,一切正常。非常感謝! –