Subversion Repositories shark

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Control interface to front ends.
 * written/copyrights 1997 by Michael Hipp
 */


#include <stdio.h>

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#include <linux/socket.h>
/* <sys/socket.h> */

#include "jukebox/controldata.h"
#include "mpg123.h"

#define MODE_STOPPED 0
#define MODE_PLAYING 1
#define MODE_PAUSED 2

extern FILE *filept;
extern int tabsel_123[2][3][16];

int sajber_sendmsg(int type,int data)
{
        TControlMsg msg;
        msg.type = type;
        msg.data = data;
        return write(1,&msg,sizeof(TControlMsg));
}

void control_sajber(struct frame *fr)
{
        struct timeval timeout;
        fd_set readfds;
        int n;
        int mode = MODE_STOPPED;
        TControlMsg smsg,rmsg;
        struct msghdr msghdr;
        struct m_cmsghdr cmsghdr;
        struct iovec iovec[1];
        char buf[2];
        int init = 0;
        int framecnt = 0;

        while(1) {
                timeout.tv_sec = 0;
                timeout.tv_usec = 0;
                FD_ZERO(&readfds);
                FD_SET(0,&readfds);

                if(mode == MODE_PLAYING) {
                        n = select(32,&readfds,NULL,NULL,&timeout);
                        if(n == 0) {
                                if(!read_frame(fr)) {
                                        mode = MODE_STOPPED;
                                        close_stream();
                                        sajber_sendmsg(MSG_NEXT,0);
                                        continue;
                                }
                                play_frame(init,fr);
                                if(init) {
                                        AudioInfo sai;
                                        sai.bitrate = tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index] * 1000;
                                        sai.frequency = freqs[fr->sampling_frequency];
                                        sai.stereo = fr->stereo;
                                        sai.type = fr->lay;
                                        sai.sample = 16;
                                        sajber_sendmsg(MSG_INFO,TRUE);
                                        write(1,&sai,sizeof(AudioInfo));
                                        init = 0;
                                       
                                }
                                framecnt++;
                                if(!(framecnt & 0xf)) {
                                        sajber_sendmsg(MSG_FRAMES,framecnt);
                                        sajber_sendmsg(MSG_POSITION,tell_stream());
                                }
                        }
                }
                else {
                        while(1) {
                                n = select(32,&readfds,NULL,NULL,NULL);
                                if(n > 0)
                                        break;
                        }
                }
                if(n < 0) {
                        exit(1);
                }
                if(n > 0) {
                        int len;
                        len = read(0,&rmsg,sizeof(TControlMsg));
                        if(len != sizeof(TControlMsg)) {
                                fprintf(stderr,"Error reading control message!\n");
                                exit(1);
                        }
#if 0
fprintf(stderr,"%d.%d\n",rmsg.type,rmsg.data);
#endif
                        switch(rmsg.type) {
                                case MSG_CTRL:
                                        switch(rmsg.data) {
                                                case FORWARD_STEP:
                                                        if(mode != MODE_STOPPED) {
                                                                int i;
                                                                for(i=0;i<16;i++) {
                                                                        read_frame(fr);
                                                                        if(framecnt && fr->lay == 3)
                                                                                set_pointer(512);
                                                                        framecnt++;
                                                                }
                                                        }
                                                        sajber_sendmsg(MSG_RESPONSE,FORWARD_STEP);
                                                        break;
                                                case FORWARD_BEGIN:
                                                        sajber_sendmsg(MSG_RESPONSE,FORWARD_BEGIN);
                                                        break;
                                                case FORWARD_END:
                                                        sajber_sendmsg(MSG_RESPONSE,FORWARD_END);
                                                        break;
                                                case REWIND_BEGIN:
                                                        sajber_sendmsg(MSG_RESPONSE,REWIND_BEGIN);
                                                        break;
                                                case REWIND_STEP:
                                                        if(back_frame(fr,16) == 0)
                                                                framecnt -= 16;
                                                        else
                                                                framecnt = 0;
                                                        sajber_sendmsg(MSG_RESPONSE,REWIND_STEP);
                                                        break;
                                                case REWIND_END:
                                                        sajber_sendmsg(MSG_RESPONSE,REWIND_END);
                                                        break;
                                                case PLAY_STOP:
                                                        mode = MODE_STOPPED;
                                                        close_stream();
                                                        break;
                                                case PLAY_PAUSE:
                                                        mode = MODE_PAUSED;
                                                        break;
                                        }
                                        break;
                                case MSG_BUFFER:
                                        break;
                                case MSG_SONG:
                                        if(mode == MODE_PLAYING) {
                                                close_stream();
                                                mode = MODE_STOPPED;
                                        }

                                        iovec[0].iov_base = buf;
                                        iovec[0].iov_len = 2;
                                        /*
                                         * this control message 'delivers' a given file
                                         * descriptor to another process ..
                                         * the sent descriptor can then be accesed by the
                                         * child process.
                                         */

                                        cmsghdr.cmsg_len = sizeof(cmsghdr);
                                        cmsghdr.cmsg_level = SOL_SOCKET;
                                        cmsghdr.cmsg_type = SCM_RIGHTS;

                                        msghdr.msg_name = NULL;
                                        msghdr.msg_namelen = 0;
                                        msghdr.msg_iov = iovec;
                                        msghdr.msg_iovlen = 1;
                                        msghdr.msg_control = &cmsghdr;
                                        msghdr.msg_controllen = sizeof(cmsghdr);

                                        if(recvmsg(0,&msghdr,0) < 0) {
                                                perror("recvmsg");
                                                exit(1);
                                        }

                                        open_stream(NULL,cmsghdr.fd);
                                        mode = MODE_PLAYING;
                                        init = 1;
                                        framecnt = 0;
                                        read_frame_init();
                                        break;
                                case MSG_QUIT:
                                        exit(0);
                                        break;
                                case MSG_QUERY:
                                        smsg.type = MSG_RESPONSE;
                                        smsg.data = FALSE;
                                        switch(rmsg.data) {
                                                case QUERY_PLAYING:
                                                        if(mode == MODE_PLAYING)
                                                                smsg.data = TRUE;
                                                        break;
                                                case QUERY_PAUSED:
                                                        if(mode == MODE_PAUSED)
                                                                smsg.data = TRUE;
                                                        break;
                                        }
                                        write(1,&smsg,sizeof(TControlMsg));
                                        break;
                                case MSG_BUFAHEAD:
                                        break;
                                case MSG_SEEK:
                                        break;
                                case MSG_PRIORITY:
                                        break;
                                case MSG_RELEASE:
                                        break;
                        }
                       
                }
        }
}

void control_tk3play(struct frame *fr)
{

}