[Icecast-dev] Icecast Streaming to an iPhone or iPod touch

Christopher Zenzel czenzel at me.com
Sat Nov 29 13:05:03 PST 2008


Hello everyone,

I have created a patch that allows an iPod touch or iPhone with "CoreMedia" to receive Icecast streams directly from the server.

I did modify the original patch from the mailing list to include user agent switching for CoreMedia vs. other browsers.

Please let me know how it works. I have been streaming a local weather radio on Icecast with the iPhone patch (attached) has been working great!

Thanks,
Christopher Zenzel

--- src/format.c	2008-04-19 23:24:30.000000000 -0400
+++ src/format.c	2008-11-29 15:50:59.000000000 -0500
@@ -280,12 +280,32 @@
     avl_node *node;
     ice_config_t *config;
 
+    /* Partial hack, check for range and user agent in this function */
+    const char *useragent;
+    useragent = httpp_getvar (client->parser, "user-agent");
+    int appledevicesupp = 0;
+    
+    if (useragent && strstr(useragent, "CoreMedia")) {
+        appledevicesupp = 1;
+    }
+
     remaining = client->refbuf->len;
     ptr = client->refbuf->data;
     client->respcode = 200;
 
-    bytes = snprintf (ptr, remaining, "HTTP/1.0 200 OK\r\n"
-            "Content-Type: %s\r\n", source->format->contenttype);
+    if (!appledevicesupp) {
+        bytes = snprintf (ptr, remaining, "HTTP/1.0 200 OK\r\n"
+                "Content-Type: %s\r\n", source->format->contenttype);
+    } else {
+        char *range = httpp_getvar(client->parser, "range");
+        if (range) {
+            bytes = snprintf(ptr, remaining, "HTTP/1.1 206 Partial Content\r\n"
+                 "Content-Type: %s\r\n", source->format->contenttype);
+        } else {
+            bytes = snprintf(ptr, remaining, "HTTP/1.0 200 OK\r\n",
+                 "Content-Type: %s\r\n", source->format->contenttype);
+        }
+    }
 
     remaining -= bytes;
     ptr += bytes;


--- src/format_mp3.c	2007-10-18 23:02:35.000000000 -0400
+++ src/format_mp3.c	2008-11-29 15:50:49.000000000 -0500
@@ -658,6 +658,53 @@
         ptr += bytes; 
     }
 
+    /* hack for iPhone OS or Simulator with CoreMedia. checks user agent then adds iPhone-specific headers */
+    char *range;
+    range = httpp_getvar(client->parser, "range");
+    int appledevicesupp = 0;
+    if (useragent && strstr(useragent, "CoreMedia")) {
+        appledevicesupp = 1;
+    }
+    if (appledevicesupp)
+    {
+        int rangenumber;
+        int rangenumber2;
+        if (range != NULL) {
+             int ret = 0;
+             int rangeproblem = 0;
+             ret = sscanf(range, "bytes=%d-%d", &rangenumber, &rangenumber2);
+             if (ret != 2) {
+                  rangeproblem = 1;
+             }
+             if (rangenumber < 0) {
+                  rangeproblem = 1;
+             }
+             if (!rangeproblem) {
+                  char currenttime[50];
+                  time_t now;
+                  int strflen;
+                  struct tm result;
+                  time(&now);
+                  strflen = strftime(currenttime, 50, "%a, %d-%b-%Y %X GMT",
+                                     gmtime_r(&now, &result));
+                  client->respcode = 206;
+                  bytes = snprintf(ptr, remaining, "Date: %s\r\n", currenttime);
+                  if (bytes > 0)
+                  {
+                       remaining -= bytes;
+                       ptr += bytes;
+                  }
+                  bytes = snprintf(ptr, remaining, "Content-Range: bytes %d-%d/221183499\r\n",
+                                   rangenumber, rangenumber2);
+                  if (bytes > 0)
+                  {
+                       remaining -= bytes;
+                       ptr += bytes;
+                  }
+             }
+        }
+    }
+
     client->format_data = client_mp3;
     client->free_client_data = free_mp3_client_data;
     metadata = httpp_getvar(client->parser, "icy-metadata");




More information about the Icecast-dev mailing list