генерировать прямоугольную волну с помощью Core Audio

Я пытаюсь создать прямоугольную волну с помощью Core Audio с кодом ниже. AIFF-файл ничего не генерирует, какие бы аргументы я ни передал. Образец взят из Learning Core Audio Кевина Авилы https://rads.stackoverflow.com/amzn/click/com/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;
    }
}

}


person Tony Wang    schedule 22.09.2013    source источник


Ответы (1)


Уверен, что ваш AudioFileClose() не должен находиться внутри цикла for. Это должно выйти за пределы цикла после того, как вы записали все сэмплы.

Пожалуйста, проверьте загружаемый код на главная страница книги. Я только что скачал и запустил его, и он работает так, как описано в книге (хотя, поскольку он был создан для Lion, вам придется обновить целевой SDK в настройках проекта, если вы используете Mountain Lion или Mavericks)

--Крис (недопустимое имя)

person invalidname    schedule 23.09.2013
comment
Большое спасибо . Я нашел проблему. Оригинальный код работает хорошо. Версия xcode 5, и дуга установлена ​​да. когда дуги нет, все работает. Так что большое спасибо! - person Tony Wang; 23.09.2013