Search code examples
macosobjective-c++audiounit

Audio Unit File Reader with AudioFileID and Encrypted File


I am reading in and playing audio files in MacOS using Audio Unit Generator AudioFilePlayer

AudioComponentDescription fileplayercd = {0};
fileplayercd.componentType = kAudioUnitType_Generator;
fileplayercd.componentSubType = kAudioUnitSubType_AudioFilePlayer;
fileplayercd.componentManufacturer = kAudioUnitManufacturer_Apple;
AUNode fileNode;
AUGraphAddNode(graph, &fileplayercd, &fileNode);

and setting its source file with

CFURLRef inputFileUrl =CFURLCreateWithFileSystemPath(kCFAllocatorDefault, INPUT_FILE_LOCATION, kCFURLPOSIXPathStyle, false);
AudioFileID inputFile;
AudioFileOpenURL(inputFileUrl, kAudioFileReadPermission, 0, &inputFile)
AUGraphNodeInfo(graph, fileNode, NULL, fileAU);
AudioUnitSetProperty(fileAU, kAudioUnitProperty_ScheduledFileIDs, kAudioUnitScope_Global, 0, &inputFile, sizeof(inputFile))

but my real audio files are all encrypted so I cannot use a raw AudioFileID. Instead, I need to somehow extend the ID and insert the decrypt code before any "real" reads. Is this possible?


Solution

  • This can be accomplished using AudioFileOpenWithCallbacks with parameters for read getsize callbacks.

    OSStatus result = AudioFileOpenWithCallbacks((__bridge void*)audioData, readProc, 0, getSizeProc, 0, 0, &inputFile);
    

    Details on usage can be found in this related question.