mp3ファイルからID3タグを読み込むサンプル

多分合ってる。試したOSバージョンは10.7.2(Lion)

// gcc -Wall -framework AudioToolbox -framework CoreServices -o main main.c

#import <AudioToolbox/AudioToolbox.h>

int main (int argc, const char * argv[])
{
    const char* inputFile = "sample.mp3";

    AudioFileID audioFile;
    CFURLRef urlRef = CFURLCreateFromFileSystemRepresentation(
        kCFAllocatorDefault, (const UInt8 *)inputFile, strlen(inputFile), false);

    OSStatus err = noErr;
    err = AudioFileOpenURL(urlRef, kAudioFileReadPermission, 0, &audioFile);	
    CFRelease(urlRef);
    if (err != noErr) {
        fprintf(stderr, "*** Failed to open file:%s. OSStatus=%d\n", inputFile, err);
        exit(err);
    }
    
    // read ID3 tag size f/file
    UInt32 id3tagSize;
    UInt32 isWritable;
    
    err = AudioFileGetPropertyInfo(audioFile, kAudioFilePropertyID3Tag, &id3tagSize, &isWritable);
    fprintf(stderr, "### id3tagSize = %d, isWritable=%d\n", id3tagSize, isWritable);
    if (err != noErr) {
        fprintf(stderr, "*** Failed to get ID3 tag size f/file:%s. OSStatus=%d\n", inputFile, err);
        AudioFileClose(audioFile);
        exit(err);
    }
    
    // read ID3 tag f/file
    char *id3tagBuf = malloc(id3tagSize);
    err = AudioFileGetProperty(audioFile,kAudioFilePropertyID3Tag, &id3tagSize, id3tagBuf);
    if (err != noErr) {
        fprintf(stderr, "*** Failed to get ID3 tag f/file:%s. OSStatus=%d\n", inputFile, err);
        free(id3tagBuf);
        AudioFileClose(audioFile);
        exit(err);
    }

    // convert ID3 tag to CFDictionary
    CFDictionaryRef dictRef = nil;
    UInt32 dictRefSize   = sizeof(dictRef);
    
    err = AudioFormatGetProperty(kAudioFormatProperty_ID3TagToDictionary,
                                    id3tagSize, id3tagBuf,
                                    &dictRefSize, &dictRef);
    if (err != noErr) {
        fprintf(stderr, "*** Failed to convert ID3 tag to CFDict. OSStatus=%d\n", err);
        free(id3tagBuf);
        AudioFileClose(audioFile);
        exit(err);
    }

    // debug print
    CFShow(dictRef);

    // release buffers
    free(id3tagBuf);
    CFRelease(dictRef);
    
    // close file
    AudioFileClose(audioFile);
    
    return 0;
}

しかしどうやって書き込もう……