int stream_send_data(stream_description *s, unsigned char *buf, unsigned long len) { int ret; if(s->stream->savefile) { int ret = fwrite(buf, 1, len, s->stream->savefile); if(ret != len) LOG_ERROR1("Failed to write %d bytes to savefile", len); } ret = shout_send_raw(s->shout, buf, len); if(ret < 0) return 0; /* Force server-reconnect */ else return ret; }
static int send_mp3(shout_t* self, const unsigned char* buff, size_t len) { mp3_data_t *mp3_data = (mp3_data_t*)self->format_data; unsigned long pos; uint32_t head; int ret, count; int start, end, error, i; unsigned char *bridge_buff; mp3_header_t mh; bridge_buff = NULL; pos = 0; start = 0; error = 0; end = len - 1; memset(&mh, 0, sizeof(mh)); /* finish the previous frame */ if (mp3_data->frame_left > 0) { /* is the rest of the frame here? */ if (mp3_data->frame_left <= len) { self->senttime += (int64_t)((double)mp3_data->frame_samples / (double)mp3_data->frame_samplerate * 1000000); mp3_data->frames++; pos += mp3_data->frame_left; mp3_data->frame_left = 0; } else { mp3_data->frame_left -= len; pos = len; } } /* header was over the boundary, so build a new build a new buffer */ if (mp3_data->header_bridges) { bridge_buff = (unsigned char*)malloc(len + mp3_data->header_bridges); if (bridge_buff == NULL) { return self->error = SHOUTERR_MALLOC; } bridge_buff[0] = mp3_data->header_bridge[0]; bridge_buff[1] = mp3_data->header_bridge[1]; bridge_buff[2] = mp3_data->header_bridge[2]; memcpy(&bridge_buff[mp3_data->header_bridges], buff, len); buff = bridge_buff; len += mp3_data->header_bridges; end = len - 1; mp3_data->header_bridges = 0; } /* this is the main loop * we handle everything but the last 4 bytes... */ while ((pos + 4) <= len) { /* find mp3 header */ head = (buff[pos] << 24) | (buff[pos + 1] << 16) | (buff[pos + 2] << 8) | (buff[pos + 3]); /* is this a valid header? */ if (mp3_header(head, &mh)) { if (error) { start = pos; end = len - 1; error = 0; } mp3_data->frame_samples = mh.samples; mp3_data->frame_samplerate = mh.samplerate; /* do we have a complete frame in this buffer? */ if (len - pos >= mh.framesize) { self->senttime += (int64_t)((double)mp3_data->frame_samples / (double)mp3_data->frame_samplerate * 1000000); mp3_data->frames++; pos += mh.framesize; } else { mp3_data->frame_left = mh.framesize - (len - pos); pos = len; } } else { /* there was an error ** so we send all the valid data up to this point */ if (!error) { error = 1; end = pos - 1; count = end - start + 1; if (count > 0) { ret = shout_send_raw(self, &buff[start], count); } else { ret = 0; } if (ret != count) { if (bridge_buff != NULL) free(bridge_buff); return self->error = SHOUTERR_SOCKET; } } pos++; } } /* catch the tail if there is one */ if ((pos > (len - 4)) && (pos < len)) { end = pos - 1; i = 0; while (pos < len) { mp3_data->header_bridge[i] = buff[pos]; pos++; i++; } mp3_data->header_bridges = i; } if (!error) { /* if there's no errors, lets send the frames */ count = end - start + 1; if (count > 0) ret = shout_send_raw(self, &buff[start], count); else ret = 0; if (bridge_buff != NULL) free(bridge_buff); if (ret == count) { return self->error = SHOUTERR_SUCCESS; } else { return self->error = SHOUTERR_SOCKET; } } if (bridge_buff != NULL) free(bridge_buff); return self->error = SHOUTERR_SUCCESS; }