Radio App Example iPhone

I was working on an application to play audio stream from an online radio. Here is some hints for the developers who want to do similar types of work.

Initially we have two major task:
1. Read stream data.
2. Play the stream data.

From apple developer documentation:

http://developer.apple.com/iphone/library/codinghowtos/AudioAndVideo/index.html#STREAMING

How do I play streamed audio?

To play streamed audio, you connect to a network stream using the CFNetwork interfaces from Core Foundation, such as those in CFHTTPMessage. You then parse the network packets into audio packets using Audio File Stream Services (AudioToolbox/AudioFileStream.h). Finally, you play the audio packets using Audio Queue Services (AudioToolbox/AudioQueue.h). You can also use Audio File Stream Services to parse audio packets from an on-disk file.

Task 1: Working with HTTP stream

Read “CFNetwork Programming Guide” specially the “Communicating with HTTP Servers” part.

Use the callback

if (CFReadStreamSetClient(myReadStream, registeredEvents, myCallBack, &myContext) {...}

A sample callback:

static void myCallBack
(CFReadStreamRef stream, CFStreamEventType type, void *clientCallBackInfo) {
if(type == kCFStreamEventHasBytesAvailable) {
UInt8 buffer[2048];
CFIndex bytesRead = CFReadStreamRead(stream, buffer, sizeof(buffer));

if (bytesRead > 0) {
//nothing
}
else if (bytesRead) {
NSString* to_add = [NSString stringWithCString: (char*)buffer length: bytesRead];
NSLog(@"%@", to_add);
}
}
}

Run the application. If you can see the HTML tag in your debug console, then your network stream reading is working fine.

Task 2: Working with audio

Read “Audio File Stream Services Reference” to get basic idea about the streaming audio.

Check the “AudioFileStreamExample” from:
http://developer.apple.com/Mac/library/samplecode/AudioFileStreamExample/index.html

Merge the “AudioFileStreamParseBytes” with the “myCallBack” method.

Download Sample Code:
http://www.mymacbd.com/forum/viewtopic.php?id=26

Comments

  1. hello, very nice tutorial, but do you have an active link to download your sample. Because I still can't make my apps stream music.
    So if you could give us a working link to your sample.

    Thanks in advnce.

    Hermann

  2. You need to create another HTTP request to get the stream related information.
    Have a look in the following URL:
    http://www.sluniverse.com/php/vb/script … tream.html
    Example: http://aac.fusionchicago.com:8006/7.html
    // 7.html gives the following in the body
    // 0 -> current listeners
    // 1 -> status
    // 2 -> listener peak
    // 3 -> max listeners
    // 4 -> reported listeners
    // 5 -> bitrate
    // 6 -> song

    Parse these information…. very simple…
    You may also interested to run this in a loop like the http audio stream.

    Please let me know if you have any other better idea ?

  3. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL
    cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
    timeoutInterval:60];

    [[NSURLConnection alloc] initWithRequest:request delegate:self];

    i use this code for grabbing site contents but it jzt returns null value from the url http://launch.fusionchicago.com:8004/

    plz giv me a nice answer…..

  4. Does anyone know latency one should expect with this method of audio transfer?

    I need the absolute lowest latency possible in my application and secondly need the ability to switch streams quickly as the user changes channels.

  5. for lower latency, simply change the following in iRadioAudioExampleViewController.m

    #define kNumAQBufs 3 // number of audio queue buffers we allocate
    #define kAQBufSize 128*1024 // number of bytes in each audio queue buffer
    #define kAQMaxPacketDescs 512 // number of packet descriptions in our array

  6. Hi Salahuddin do you have any updated example for the latest sdk? Would truly love to see this updated, there are tons of us looking for something like this on the apple forums. If you update this I can link to your site and send you all of them as traffic..we desperately need help and you seem like the only one genuinely offering actual useful information and you would certainly benefit from the huge traffic an update would produce.

  7. Hi,
    Your work is brilliant. I've modified your code and integrate it to our app. Thank you so much for the tutorial.
    God bless you, Mate
    -mamaz

  8. Hi,
    Your work is brilliant!! I have modified and integrate your code to our app.
    God bless you mate.

    -mamaz

Leave a Reply

Your email address will not be published. Required fields are marked *