Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}