0

我正在尝试使用 Core Audio 和下面的代码生成方波。无论我传递任何参数,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;
    }
}

}

4

1 回答 1

1

很确定您的 AudioFileClose() 不应该在 for 循环内。在您编写完所有示例之后,这应该超出循环。

请检查本书主页上的可下载代码。我刚刚下载并运行了它,它按照书中的描述工作(不过,由于它是为 Lion 构建的,如果您使用的是 Mountain Lion 或 Mavericks,则必须在项目设置中更新目标 SDK)

--克里斯(无效名称)

于 2013-09-23T12:32:39.693 回答