Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Examples

cursesplay.c

#include "common.h"
#include <curses.h>
#include <limits.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

/* Global repeation variable */
int repeat = 1;

static void stopplay (int signo)
{
  repeat = 0;
}

static void hhmmss (u_int16_t seconds, u_int16_t *hh, u_int16_t *mm, u_int16_t *ss)
{
  *hh = *mm = 0;
  if ( seconds >= 3600 ) *hh= seconds/3600;
  seconds -= 3600*(*hh);
  if ( seconds >= 60 ) *mm= seconds/60;
  *ss= seconds-(60*(*mm));
}

static void usage (void) {
  fprintf(stderr, "usage: play [ -D debuglvl ] <trackid> ...\n");
  exit(1);
}

int main (int argc, char **argv)
{
  njb_t njbs[NJB_MAX_DEVICES], *njb;
  int i, n, status, change, opt, debug;
  u_int16_t sec, hh, mm, ss;
  u_int32_t trackid;
  extern char *optarg;
  extern int optind;
  WINDOW * root;
  
  debug = 0;
  
  while ( (opt = getopt(argc, argv, "D:")) != -1 ) {
    switch (opt) {
    case 'D':
      debug = atoi(optarg);
      break;
    default:
      break;
    }
  }
  argc -= optind;
  argv += optind;
  
  if ( ! argc ) usage();
  
  if ( debug ) NJB_Set_Debug(debug);
  
  signal(SIGINT, stopplay);
  
  if ( NJB_Discover(njbs, 0, &n) == -1 ) {
    perror("could not probe for NJB devices\n");
    return 1;
  }
  if ( n == 0 ) {
    fprintf(stderr, "no NJB devices found\n");
    return 0;
  } 
  
  njb = njbs;
  
  if ( NJB_Open(njb) == -1 ) {
    NJB_Error_Dump(njb, stderr);
    return 1;
  }
  
  if ( NJB_Capture(njb) == -1 ) {
    NJB_Error_Dump(njb, stderr);
    return 1;
  }
  
  for (i= 0; i< argc; i++) {
    trackid= strtoul(argv[i], NULL, 10);
    
    if ( i == 0 ) {
      status= NJB_Play_Track(njb, trackid);
    } else {
      status= NJB_Queue_Track(njb, trackid);
    }
    
    if ( status == -1 ) NJB_Error_Dump(njb, stdout);
  }
  
  root = initscr();
  cbreak();
  noecho();
  halfdelay (1);
  
  printw("+---------------+\n"
         "| x  : exit     |\n"
         "| p  : pause    |\n"
         "| r  : resume   |\n"
         "| <> : seek 10s |\n"
         "+---------------+\n");
  
  change = 0;
  i = 0;
  mvprintw(6, 0, "Track ID %10.10s: 00:00:00", argv[i]);
  fflush(stdout);
  while ( repeat ) {
    int c;
    
    if ((c = getch ()) != ERR) {
      switch (c) {
      case 'p':
        NJB_Pause_Play (njb);
        break;
      case 'r':
        NJB_Resume_Play (njb);
        break;
      case 'x':
        repeat = 0;
        break;
      case '>':
        NJB_Seek_Track (njb, sec*1000+10000);
        break;
      case '<':
        NJB_Seek_Track (njb, sec > 10 ? sec*1000-10000 : 0);
        break;
      }
    }
    if ( change ) {
      i++;
      if ( i == argc ) {
        repeat= 0;
      } else {
        mvprintw(6, 0, "Track ID %10.10s: 00:00:00", argv[i]);
        refresh ();
      }
      change= 0;
    } else
      NJB_Elapsed_Time(njb, &sec, &change);
    
    hhmmss(sec, &hh, &mm, &ss);
    mvprintw (6, 21, "%02u:%02u:%02u", hh, mm, ss);
    refresh ();
  }
  echo ();
  endwin ();
  
  NJB_Stop_Play(njb);
  
  NJB_Release(njb);
  
  NJB_Close(njb);
  return 0;
}

Generated on Thu Oct 20 20:35:56 2005 for libnjb by  doxygen 1.4.4