2013-09-22 2 views
0

아래 코드로 코어 오디오를 사용하여 구형파를 생성하려고합니다. AIFF 파일은 어떤 인자를 건네도 아무 것도 생성하지 않습니다. 샘플은 Kevin Avila의 Learning Core Audio입니다. http://www.amazon.com/Learning-Core-Audio-Hands-On-Programming/dp/0321636848코어 오디오를 사용하여 구형파를 생성하십시오.

어떤 아이디어입니까? 도와주세요!

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()를위한 루프 내부에 안 예쁜 확인합니다. 모든 샘플을 작성한 후에는 루프 밖으로 나가야합니다.

the book's home page에서 다운로드 할 수있는 코드를 확인하십시오. 방금 다운로드하여 실행했으며 책에서 설명한대로 작동합니다 (Mountain Lion 또는 Mavericks를 사용하는 경우 Lion 용으로 제작되었으므로 프로젝트 설정에서 대상 SDK를 업데이트해야 함)

--Chris (잘못된 이름)

+0

고마워요. 나는 그 문제를 발견했다. 원래 코드가 잘 작동합니다. xcode의 버전은 5이고 원호는 yes로 설정됩니다. 호가 아니오로 설정되면 모든 것이 작동합니다. 정말 고마워요! –