RadioTunes Titanium SDK

RadioTunes Titanium SDK

Released 5 years ago , Last update 2 years ago

This is the Appcelerator port of the successful RadioTunes SDK component. Using this component you can write powerful radio apps in Javascript and access all the features of RadioTunes SDK.

A Powerful Radio Streaming Framework for Appcelerator App Developers!

This is a port of the 5-star rated RadioTunes SDK for iOS component which was originally developed for the iOS platform. Now you can use this powerful radio streaming engine in your Appcelerator apps too and start writing radio apps in Javascript!

Behind the scenes RadioTunes relies on the iOS AudioQueue framework and the open source LGPL licensed FFmpeg library. If your app does not require mms/wma codec functionality you can also use the RadioTunes SDK without including the FFmpeg library. The code for mms streaming is completely separated from the code for http streaming so that you can choose which portions of code you want to include in your project.

Disclaimer: RadioTunes SDK can play all Window Media Audio version 9 streams but some streams based on version 10 could fail. This Appcelerator module will only work on iOS devices and does not support Android!

Make your App look like a Pro

Be sure to check out the Radiojive Template if you want a great looking design for your radio app. This template also includes a fully working radio app that uses RadioTunes SDK!

Download the FREE Trial now and see for yourself how simple it is to add radio playback functionality to your app!

  • 5 2
  • 4 0
  • 3 0
  • 2 0
  • 1 0
2 Reviews Read Reviews


14 day 14-day money-back guarantee


Single App Binary

  • Perpetual license

  • 1 application

  • Can distribute binary products only

  • Commercial use

  • 1 month support



  • Perpetual license

  • Unlimited projects

  • Can distribute code and binary products

  • Commercial use

  • 12 months support


Enterprise - unlocked

  • Perpetual license

  • Unlimited projects

  • Can distribute code and binary products

  • Commercial use

  • 12 months support

Need custom services for this product? Get a quote


    • ASX playlist support.
    • Realtime audio recording.
    • Improved audio session management.
    • Bandwidth usage statistics.
  • Support for the http and mms protocols.
  • Supports mp3, aac, aac+ and wma audio streams.
  • PLS, M3U, ASX, XSPF and direct URL support.
  • Parsing of Shoutcast/Icecast metadata.
  • Automatic handling of interruptions like incoming phone calls.
  • Background playback.
  • Robust error handling.
  • Auto reconnect feature.
  • Works on Edge/3G/WiFi.

How to Use

To access this module from JavaScript, you would do the following:

var radiotunes = require("yl.radiotunes");

The radiotunes variable now holds a reference to the Module object.


The radiotunes module fires 3 events to nofity you about audio session interruptions. You should handle these events like this:

radiotunes.addEventListener('begin_interruption', function(e) {
    if( === null) {

radiotunes.addEventListener('end_interruption', function(e) {
    if( === null) {

    if( {;

radiotunes.addEventListener('headphone_unplugged', function(e) {
    if( === null) {

    // Pause radio if it's playing while headphones are unplugged
    if( {;

If you want to respond to the audio control buttons on the iPhone lock screen you should handle the following events:

radiotunes.addEventListener('remote_control_toggle_play_pause', function(e) {
    if( == null) {

    if( {;
    } else {;

radiotunes.addEventListener('remote_control_next_track', function(e) {
    // Add code to play next radio station here.

radiotunes.addEventListener('remote_control_previous_track', function(e) {
    // Add code to play previous radio station here.


Use this function to create a Radio object for http streaming.

var radio = radiotunes.createHTTPRadio("")


Use this function to create a Radio object for mms streaming.

var radio = radiotunes.createMMSRadio("")

Radio Methods

  • play() - Start streaming.
  • pause() - Pause streaming.
  • startRecordingWithDestination(String path) - Start recording to the specified file path.
  • stopRecording() - Stop recording.
  • fileExtensionHint() - Returns the appropriate filename extension that should be used for recording.
  • shutdown() - This method should be called before disposing the radio object!
  • isPlaying() - Returns the value of the boolean playing property.
  • isPaused() - Returns the value of the boolean paused property.
  • isBuffering() - Returns the value of the boolean buffering property.
  • isRecording() - Returns the value of the boolean recording property.
  • setBufferInSeconds(Number seconds) - Sets the number of seconds to buffer before playback starts.
  • setVolume(Number volume) - Sets the volume. This value should be between 0 and 1.

Bandwidth Methods

The connection type parameter passed as argument to some of the functions must have one of the following values:

0 = All connection types
1 = WWAN connection type
2 = WiFi connection type
  • bandwidthUsageForConnectionType(Number type) - Reports the bandwidth usage for the specified network connection type.
  • resetBandwidth() - Resets the bandwidth usage for all network connection types.
  • resetBandwidthForConnectionType(Number type) - Resets the bandwidth usage for the specified network connection type.

Radio Events

metadata - Fired when the Shoutcast/Icecast metadata for the radio is parsed and ready.'metadata', function(e) {
    if( !== undefined) {"Radio name: " +;
    if(e.genre !== undefined) {"Radio genre: " + e.genre);
    if(e.url !== undefined) {"Radio url: " + e.url);

title - Fired when the current playing item title is changed.'title', function(e) {
    myapp.ui.titleLabel.setText("Now playing: " + e.title);

state - Fired when the state of the radio object is changed.'state', function(e) {
    var state = e.state;
    if(state == 0) {
        myapp.ui.statusLabel.setText("Status: Stopped");
    } else if(state == 1) {
        myapp.ui.statusLabel.setText("Status: Connecting");
    } else if(state == 2) {
        myapp.ui.statusLabel.setText("Status: Buffering");
    } else if(state == 3) {
        myapp.ui.statusLabel.setText("Status: Playing");
    } else if(state == 4) {
        myapp.ui.statusLabel.setText("Status: Error");

        var error = e.error;
        if(error == 1) {
            myapp.ui.titleLabel.setText("Playlist could not be parsed.");
        } else if(error == 2) {
            myapp.ui.titleLabel.setText("File stream get property failed.");
        } else if(error == 3) {
            myapp.ui.titleLabel.setText("File stream could not be opened.");
        } else if(error == 4) {
            myapp.ui.titleLabel.setText("Audio queue could not be created.");
        } else if(error == 5) {
            myapp.ui.titleLabel.setText("Audio buffers could not be created.");
        } else if(error == 6) {
            myapp.ui.titleLabel.setText("Audio queue enqueue failed.");
        } else if(error == 7) {
            myapp.ui.titleLabel.setText("Audio queue could not be started.");
        } else if(error == 8) {
            myapp.ui.titleLabel.setText("Audio decoding error.");
        } else if(error == 9) {
            myapp.ui.titleLabel.setText("Radio host not reachable.");
        } else if(error == 10) {
            myapp.ui.titleLabel.setText("Network connection error.");

recording_started - Fired when recording has started.'recording_started', function(e) {"Recording started to path: " + e.path);

recording_stopped - Fired when recording has stopped successfully.'recording_stopped', function(e) {"Recording available at path: " + e.path);

recording_failed - Fired when recording has failed.'recording_failed', function(e) {"Recording failed: " + e.description);
    var code = e.code;
    if(code == 0) {"Recording failed: initialisation error");
    } else if(error == 1) {"Recording failed: file error");
    } else if(error == 2) {"Recording failed: format error");
    } else if(error == 3) {"Recording failed: write error");


  • Complete source code of the RadioTunes SDK.
  • Complete source code of the Appcelerator module.
  • Detailed documentation with integration instructions.
  • Demo Javascript app.
  • Fully automated build scripts for FFmpeg that will build universal static libraries for the armv7, armv7s, arm64, x86_64 and i386 architectures.
  • Pre-built FFmpeg universal static libraries with support for the mms protocol and wma audio codec.


I am developing an application for a customer. Which license should I use? The single app license cannot be used for building applications for your customer since the license cannot be sub-licensed nor transferred to your customer. In that case you will either have to purchase a developer license or have your customer purchase a single app license which you can then use to develop the application. However purchasing the Developer license will be a valuable investment which will pay off if you'll use it in more than one client project.

What's the difference between the Developer and Enterprise license? Both the Developer and Enterprise license allow usage in unlimited number of apps. The only difference is that the Enterprise license doesn't require license key activation. This is especially useful if you offer a product that generates custom iOS apps on demand.

Is it possible to upgrade between different licenses? An upgrade is possible. Contact us for more information or browse to the "My Purchases" section to upgrade your license.

My license is expired. What does this mean? Each of our licenses include 1 year free updates. If you want to keep receiving new updates and support you can do so by paying a renewal fee which is about 25% of the current license price. If you don't renew your license you can still keep using the version you have on hand. It will keep working without any restrictions.

4 licenses, starting from From » $99.00 View Licenses

Get A Quote

What do you need?
  • Custom development
  • Integration
  • Customization / Reskinning
  • Consultation
When do you need it?
  • Soon
  • Next week
  • Next month
  • Anytime

Thanks for getting in touch!

Your quote details have been received and we'll get back to you soon.

or Get a quote

for customization or integration services

Or enter your name and Email
  • M Mario License holderSingle App License
    6 month support
    Purchased on Aug 28, 2012
    1 year ago
    What does the error 11? Thnk
    • Kemal Taskin Publisher 1 year ago
      11 = Network connection error. All error types are explained in the documentation.
  • DM Digital Frontiers Media License holderSingle App License
    6 month support
    Purchased on Feb 19, 2013
    3 years ago
    Hi. I'm kind of confused. I see that there have been multiple updates to the SDK since I purchased my original license. When I go to the Downloads section, under version 2.10 Binary, it says: Must be a license holder to download. PICK A LICENSE And then has a bunch of prices for a license. But I'm already a license holder. Do I need to buy a whole new license just to get a minor point revision update to upgrade my client's app?
    • Kemal Taskin Publisher 3 years ago
      Hi, The binary version has a separate license. It's basically the same product without the source code. You should be able to download the versions that don't have the "binary" suffix. I would also like to mention that the single app license may not be suitable for client work. If you share the end-product (which has RadioTunes SDK's source code) with your client, your client will also have to purchase a license.
    • DM Digital Frontiers Media 3 years ago
      Understood. Thank you!
    • Kemal Taskin Publisher 3 years ago
      Hi, Can you contact me at "***". I need to talk to you about your license.
    • DM Digital Frontiers Media 3 years ago
      Just sent you email from stephen at boostdfm dot com
  • PB Pablo Burmester 3 years ago
    Hi, is there any place where I can test this app or maybe some video or images? Thanks.
    • Kemal Taskin Publisher 3 years ago
      Hi Pablo, You can download the demo which comes with a module that you can use in Appcelerator projects and example app code which features a simple radio app with recording functionality.