예제 #1
0
void is_connected_timer(void*)
{
    if(!connected)
    {
        print_info("ERROR: Connection lost\nreconnecting...", 1);
        if(cfg.srv[cfg.selected_srv]->type == SHOUTCAST)
            sc_disconnect();
        else
            ic_disconnect();

        Fl::remove_timeout(&display_info_timer);
        Fl::remove_timeout(&is_connected_timer);

        //reconnect
        button_connect_cb();

        return;
    }

    Fl::repeat_timeout(0.5, &is_connected_timer);
}
예제 #2
0
파일: shoutcast.cpp 프로젝트: atmos/butt
int sc_connect()
{
    int ret;
    char recv_buf[100];
    char send_buf[100];

    stream_socket = sock_connect(cfg.srv[cfg.selected_srv]->addr,
            cfg.srv[cfg.selected_srv]->port+1, CONN_TIMEOUT);

    if(stream_socket < 0)
    {
        switch(stream_socket)
        {
            case SOCK_ERR_CREATE:
                print_info("\nconnect: could not create network socket", 1);
                ret = 2;
                break;
            case SOCK_ERR_RESOLVE:
                print_info("\nconnect: error resolving server address", 1);
                ret = 1;
                break;
            case SOCK_TIMEOUT:
            case SOCK_INVALID:
                ret = 1;
                break;
            default:
                ret = 2;
        }

        sc_disconnect();
        return ret;
    }

    /*
    ret = sock_setbufsize(&stream_socket, 8192, 0);
    if(ret == SOCK_ERR_SET_SBUF)
        print_info("\nWarning: couldn't set socket SO_SNDBUF", 1);
    */
    sock_send(&stream_socket, cfg.srv[cfg.selected_srv]->pwd,
            strlen(cfg.srv[cfg.selected_srv]->pwd), SEND_TIMEOUT);
    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);


    if((ret = sock_recv(&stream_socket, recv_buf, sizeof(recv_buf)-1, RECV_TIMEOUT)) == 0)
    {
        usleep(100000);
        sc_disconnect();
        return 1;
    }

    if( (recv_buf[0] != 'O') || (recv_buf[1] != 'K') || (ret <= 2) )
    {
        if(strstr(recv_buf, "invalid password") != NULL)
        {
            print_info("\nconnect: invalid password!\n", 1);
            sc_disconnect();
            return 2;
        }
        return 1;
    }

    sock_send(&stream_socket, "icy-name:", 9, SEND_TIMEOUT);
    if(cfg.main.num_of_icy > 0)
        if(cfg.icy[cfg.selected_icy]->desc != NULL)
            send(stream_socket, cfg.icy[cfg.selected_icy]->desc,
                    strlen(cfg.icy[cfg.selected_icy]->desc), 0);

    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "icy-genre:", 10, SEND_TIMEOUT);
    if(cfg.main.num_of_icy > 0)
        if(cfg.icy[cfg.selected_icy]->genre != NULL)
            send(stream_socket, cfg.icy[cfg.selected_icy]->genre,
                   strlen(cfg.icy[cfg.selected_icy]->genre), 0);

    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "icy-url:", 8, SEND_TIMEOUT);
    if(cfg.main.num_of_icy > 0)
        if(cfg.icy[cfg.selected_icy]->url != NULL)
        send(stream_socket, cfg.icy[cfg.selected_icy]->url,
                strlen(cfg.icy[cfg.selected_icy]->url), 0);

    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "icy-irc:", 8, SEND_TIMEOUT);
    if(cfg.main.num_of_icy > 0)
        if(cfg.icy[cfg.selected_icy]->irc != NULL)
            send(stream_socket, cfg.icy[cfg.selected_icy]->irc,
                    strlen(cfg.icy[cfg.selected_icy]->irc), 0);

    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "icy-icq:", 8, SEND_TIMEOUT);
    if(cfg.main.num_of_icy > 0)
        if(cfg.icy[cfg.selected_icy]->icq != NULL)
            send(stream_socket, cfg.icy[cfg.selected_icy]->icq,
                    strlen(cfg.icy[cfg.selected_icy]->icq), 0);

    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "icy-aim:", 8, SEND_TIMEOUT);
    if(cfg.main.num_of_icy > 0)
        if(cfg.icy[cfg.selected_icy]->aim != NULL)
            send(stream_socket, cfg.icy[cfg.selected_icy]->aim,
                    strlen(cfg.icy[cfg.selected_icy]->aim), 0);

    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "icy-pub:", 8, SEND_TIMEOUT);
    if(cfg.main.num_of_icy > 0)
        if(cfg.icy[cfg.selected_icy]->pub != NULL)
            send(stream_socket, cfg.icy[cfg.selected_icy]->pub,
                    strlen(cfg.icy[cfg.selected_icy]->pub), 0);

    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "icy-br:", 7, SEND_TIMEOUT);
    snprintf(send_buf, 100, "%u", cfg.audio.bitrate);
    sock_send(&stream_socket, send_buf, strlen(send_buf), SEND_TIMEOUT);
    sock_send(&stream_socket, "\n", 1, SEND_TIMEOUT);

    sock_send(&stream_socket, "content-type:", 13, SEND_TIMEOUT);

    if(!strcmp(cfg.audio.codec, "mp3"))
    {
        strcpy(send_buf, "audio/mpeg");
        sock_send(&stream_socket, send_buf, strlen(send_buf), SEND_TIMEOUT);
    }

    sock_send(&stream_socket, "\n\n", 2, SEND_TIMEOUT);

    connected = 1;

    timer_init(&stream_timer, 1);       //starts the "online" timer

    return 0;
}