00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00045 #include <cfg/os.h>
00046 #include <cfg/clock.h>
00047 #include <dev/board.h>
00048
00049 #include <stdlib.h>
00050 #include <string.h>
00051 #include <stdio.h>
00052 #include <fcntl.h>
00053 #include <io.h>
00054
00055 #include <sys/version.h>
00056 #include <sys/confnet.h>
00057 #include <sys/atom.h>
00058 #include <sys/heap.h>
00059 #include <sys/thread.h>
00060 #include <sys/timer.h>
00061 #include <sys/event.h>
00062 #include <sys/socket.h>
00063
00064 #if defined(USE_SOFTWARE_CODEC)
00065 #include <hxmp3/mp3dec.h>
00066 #endif
00067
00068 #include <netinet/tcp.h>
00069 #include <arpa/inet.h>
00070 #include <net/route.h>
00071 #include <pro/dhcp.h>
00072
00073 #include "config.h"
00074 #include "logmsg.h"
00075 #include "receiver.h"
00076 #include "shoutcast.h"
00077
00086 RECEIVERINFO * ReceiverCreate(RECEIVERPLUGIN *plugin)
00087 {
00088 RECEIVERINFO *rip;
00089
00090
00091 if ((rip = malloc(sizeof(RECEIVERINFO))) != NULL) {
00092 memset(rip, 0, sizeof(RECEIVERINFO));
00093 rip->ri_rpp = plugin;
00094
00095 if ((*plugin->rp_create) (rip)) {
00096 free(rip);
00097 rip = NULL;
00098 }
00099 }
00100 return rip;
00101 }
00102
00113 static int ReceiverPlugInControl(RECEIVERINFO *rip, u_int sst, u_int xst)
00114 {
00115 int retries = 10;
00116
00117 while ((rip->ri_status & xst) == 0) {
00118 rip->ri_status |= sst;
00119 NutEventPost(&rip->ri_cmdevt);
00120 NutEventWait(&rip->ri_stsevt, 500);
00121 if (retries-- <= 0) {
00122 LogMsg(LOG_ERROR, "No receiver control (%02x->%02x->%02x)\n", sst, xst, rip->ri_status);
00123 return -1;
00124 }
00125 }
00126 return 0;
00127 }
00128
00136 u_int ReceiverStatus(RECEIVERINFO *rip)
00137 {
00138 return rip->ri_status;
00139 }
00140
00148 int ReceiverStop(RECEIVERINFO *rip)
00149 {
00150 return ReceiverPlugInControl(rip, RSTAT_STOP, RSTAT_IDLE);
00151 }
00152
00162 RECEIVERINFO *ReceiverStart(RECEIVERINFO *ritab[], STATIONINFO *sip)
00163 {
00164 RECEIVERINFO *rip;
00165 int i;
00166
00167 for (i = 0; ritab[i]; i++) {
00168 rip = ritab[i];
00169 if ((*rip->ri_rpp->rp_setup)(rip, sip) == 0) {
00170
00171 if (ReceiverStop(rip) == 0) {
00172
00173 rip->ri_sip = sip;
00174 if (ReceiverPlugInControl(rip, RSTAT_START, RSTAT_BUFFERING | RSTAT_RUNNING) == 0) {
00175
00176 return rip;
00177 }
00178 }
00179 }
00180 }
00181 LogMsg(LOG_WARN, "Receiver start failed\n");
00182
00183 return NULL;
00184 }
00185