Search code examples
cocoamacoscore-audiomacos-carbon

how can I play archived audio with carbon or cocoa


I've got an archive file containing multiple audio files in .mp3 format. I can seek to a specified file and retrieve that file in blocks.

I'd like to play several of these files in succession. It seems like this should be a simple thing to do, but I'm having difficulty finding a solid example of how to do this.

I've tried using the AudioStreamer example by matt gallagher and the apple aqplay and afsplay examples and they seem excessively complicated and I just cant get them to do what I need.

So does anyone have any pointers on how I can achieve this?

Extracting the files to disk and playing them is a solution I'd like to avoid.

UPDATE:

The original question isn't clear about this, but the format is a custom archive format, which I can read chunk by chunk. For various reasons I cant/wont save the files out to temporaries. So what I'm looking for is a way to feed the chunks into an audio library to play them.

The AudioStreamer and afsplay examples almost do this - working beautifully for the first track - but then choke on the second track - probably as they are designed for single streams, not streams from multiple files one after the other... the changes should be simple, but my knowledge of coreaudio is zero. I suspect that core audio is also overkill for this kind of problem ( but then again maybe not .. again zero experience working against me)


Solution

  • [Revised answer]

    Oh, OK. You're decoding the archive anyway, so this is basically no different than any other situation where you're continuously receiving/retrieving the contents of multiple successive tracks from a source. Essentially, streaming, except not over the network.

    You should be able to do this with an Audio Queue.

    Note that you may have to change audio configurations (ASBD) between files, if, say, their bit rates or sample rates differ.

    I'm not a Core Audio expert, though. Somebody else could probably provide a more specific answer.