1
0
Files
irix-657m-src/eoe/cmd/cdplayer/skip.c
2022-09-29 17:59:04 +03:00

242 lines
5.1 KiB
C

/*
* skip.c
*
* Description:
* Routines for skipping through the tracks on a CD
*
* History:
* rogerc 11/06/90 Created
*/
#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include "cdaudio.h"
#include "program.h"
#include "client.h"
#include "skip.h"
#define PAUSEINTERVAL 2000
static void unpause( CLIENTDATA *clientp, XtIntervalId *id );
/*
* void skipf( Widget w, CLIENTDATA *clientp, XmAnyCallbackStruct *call_data )
*
* Description:
* Skip to the next track and pause for PAUSEINTERVAL seconds if playing
* Skip to the next track and continue pausing if paused
* Move clientp->start_track to next track if ready
*
* Parameters:
* w The skipf button
* clientp Client data
* call_data ignored
*/
void skipf( Widget w, CLIENTDATA *clientp, XmAnyCallbackStruct *call_data )
{
CDSTATUS status;
/*
* Need more up to date status than clientp->status
*/
CDgetstatus( clientp->cdplayer, &status );
if (clientp->start_track < status.first)
clientp->start_track = status.first;
switch (status.state) {
case CD_PAUSED:
case CD_STILL:
case CD_PLAYING:
switch (clientp->play_mode) {
case PLAYMODE_NORMAL:
default:
if (status.track < status.last) {
CDplay( clientp->cdplayer, status.track + 1, 0 );
if (clientp->pauseid) {
XtRemoveTimeOut( clientp->pauseid );
clientp->pauseid = 0;
clientp->skipping = 0;
}
if (!clientp->user_paused) {
clientp->pauseid = XtAddTimeOut( PAUSEINTERVAL, unpause,
clientp );
clientp->skipping = 1;
}
}
break;
case PLAYMODE_SHUFFLE:
case PLAYMODE_PROGRAM:
if (!program_playing_last( clientp->program )) {
program_inc_current( clientp->program );
program_play( clientp->cdplayer, clientp->program, 0 );
if (clientp->pauseid) {
XtRemoveTimeOut( clientp->pauseid );
clientp->pauseid = 0;
clientp->skipping = 0;
}
if (!clientp->user_paused) {
clientp->pauseid = XtAddTimeOut( PAUSEINTERVAL, unpause,
clientp );
clientp->skipping = 1;
}
}
break;
}
break;
case CD_READY:
switch (clientp->play_mode) {
default:
case PLAYMODE_NORMAL:
if (clientp->start_track < status.last) {
clientp->start_track++;
draw_display( clientp );
}
break;
case PLAYMODE_SHUFFLE:
case PLAYMODE_PROGRAM:
if (!program_playing_last( clientp->program )) {
program_inc_current( clientp->program );
draw_display( clientp );
}
break;
}
break;
default:
break;
}
}
/*
* void skipb( Widget w, CLIENTDATA *clientp, XmAnyCallbackStruct *call_data )
*
* Description:
* Skip back one track and pause for PAUSEINTERVAL milliseconds if playing
* Skip back and pause indefinitely if paused
* move clientp->start_track back one if ready
*
* Parameters:
* w The skipb button
* clientp Client data
* call_data ignored
*/
void skipb( Widget w, CLIENTDATA *clientp, XmAnyCallbackStruct *call_data )
{
CDSTATUS status;
int start;
/*
* Need more up to date status than clientp->status
*/
CDgetstatus( clientp->cdplayer, &status );
switch (status.state) {
case CD_PLAYING:
switch (clientp->play_mode) {
case PLAYMODE_NORMAL:
default:
CDplay( clientp->cdplayer, status.track, 0 );
break;
case PLAYMODE_SHUFFLE:
case PLAYMODE_PROGRAM:
program_play( clientp->cdplayer, clientp->program, 0 );
break;
}
break;
case CD_STILL:
case CD_PAUSED:
switch (clientp->play_mode) {
case PLAYMODE_NORMAL:
default:
if (clientp->user_paused && !clientp->skipped_back) {
start = status.track;
clientp->skipped_back = 1;
}
else
start =
status.track > status.first ? status.track - 1 : status.first;
CDplay( clientp->cdplayer, start, 0 );
break;
case PLAYMODE_SHUFFLE:
case PLAYMODE_PROGRAM:
if (clientp->user_paused && !clientp->skipped_back)
clientp->skipped_back = 1;
else
program_dec_current( clientp->program );
program_play( clientp->cdplayer, clientp->program, 0 );
break;
}
break;
case CD_READY:
switch (clientp->play_mode) {
case PLAYMODE_NORMAL:
default:
if (clientp->start_track > status.first) {
clientp->start_track--;
draw_display( clientp );
}
break;
case PLAYMODE_SHUFFLE:
case PLAYMODE_PROGRAM:
program_dec_current( clientp->program );
draw_display( clientp );
break;
}
break;
default:
break;
}
if (clientp->pauseid) {
XtRemoveTimeOut( clientp->pauseid );
clientp->pauseid = 0;
clientp->skipping = 0;
}
if (!clientp->user_paused) {
clientp->pauseid = XtAddTimeOut( PAUSEINTERVAL, unpause, clientp );
clientp->skipping = 1;
}
}
/*
* static void unpause( CLIENTDATA *clientp, XtIntervalId *id )
*
* Description:
* Takes the CD-ROM drive out of pause state for when a skip has
* occurred and its time out has expired
*
* Parameters:
* clientp Client data
* id time out id
*/
static void unpause( CLIENTDATA *clientp, XtIntervalId *id )
{
CDSTATUS status;
clientp->pauseid = 0;
clientp->skipping = 0;
/*
* Need more up to date status than clientp->status
*/
CDgetstatus( clientp->cdplayer, &status );
if (status.state == CD_PAUSED || status.state == CD_STILL)
CDtogglepause( clientp->cdplayer );
}