From 0061d8dda9c4525c50d16a10d3e33b0302856030 Mon Sep 17 00:00:00 2001 From: pedroediaz Date: Sun, 17 Dec 2023 13:09:51 +0600 Subject: [PATCH] First commit: Working cdplayer for linux using tinyalsa --- LICENSE | 5 +++ README | 18 ++++++++ cdplayer.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 LICENSE create mode 100644 README create mode 100644 cdplayer.c diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..db060b4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,5 @@ +Copyright (c) 2023 by PedroEdiaz . + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/README b/README new file mode 100644 index 0000000..47c851c --- /dev/null +++ b/README @@ -0,0 +1,18 @@ + cdplayer + +"cdplayer" is a minimal CDDA (Compact Disk Digital Audio) player +for linux, that only depend on tinyalsa. + +BUILD: + cc -ltinyalsa -o cdplayer cdplayer.c + +USAGE: + ./cdplayer /dev/sr0 () () // play cd + + kill -USR1 // Seek a minute forward + kill -USR2 // Seek a minute backward + kill -STOP // Stop + kill -CONT // Play + +LICENSE: + 0BSD Copyright (c) 2023 by pedroediaz diff --git a/cdplayer.c b/cdplayer.c new file mode 100644 index 0000000..4d5a5d9 --- /dev/null +++ b/cdplayer.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include + +#define FRAMES 1 + +#define SIZE CD_FRAMESIZE_RAW +#define PERIOD 1024 +#define COUNT 2 + +struct cdrom_read_audio sr; + +void forward( int signum ) +{ + sr.addr.lba+=3600; +} + +void backward( int signum ) +{ + sr.addr.lba-=3600; +} + +void weite_err( char * s ) +{ + char * p; + p=s; + while( *p ) + ++p; + write( STDERR_FILENO, p, p-s ); +} + +int main( int argc, char * argv[] ) +{ + int fdi, card=0, device=0; + struct pcm * pcm; + struct pcm_config config; + char *msg, buff[SIZE*FRAMES]; + struct sigaction f_action, b_action; + + if( argc < 2 ) + { + weite_err( "Usage: " ); + weite_err( argv[0] ); + weite_err( " /dev/sr0 () ()" ); + goto err0; + } + + if( (fdi=open( argv[1] , O_RDONLY | O_NONBLOCK )) < 0 ) + { + weite_err( "couldn't open input device " ); + weite_err( argv[1] ); + weite_err( " \n" ); + goto err0; + } + + switch( ioctl( fdi, CDROM_DRIVE_STATUS, 0 ) ) + { + case CDS_NO_DISC: + weite_err( "No disk\n" ); + goto err1; + case CDS_DRIVE_NOT_READY: + weite_err( "Drive not ready\n" ); + goto err1; + case CDS_TRAY_OPEN: + weite_err( "Tray open\n" ); + goto err1; + case -1: + weite_err( "Error\n" ); + goto err1; + } + + switch( argc ) + { + case 4: + device = *argv[3] - '0'; + case 3: + card = *argv[2] - '0'; + } + + /* Prepare signals */ + { + f_action.sa_handler = forward ; + b_action.sa_handler = backward ; + + sigaddset( &f_action.sa_mask, SIGUSR1 ); + sigaddset( &b_action.sa_mask, SIGUSR2 ); + sigaction( SIGUSR1, &f_action, NULL ); + sigaction( SIGUSR2, &b_action, NULL ); + } + + /* config pcm */ + { + config.channels = 2; + config.rate = 44100; + config.format = PCM_FORMAT_S16_LE; + + config.period_size = PERIOD; + config.period_count = COUNT; + config.start_threshold = PERIOD; + config.silence_threshold = PERIOD*COUNT; + config.stop_threshold = PERIOD*COUNT; + } + + /* config sr */ + { + sr.buf = buff; + sr.nframes = FRAMES; + sr.addr_format = CDROM_LBA; + } + + pcm = pcm_open( card, device, PCM_OUT , &config ); + + sr.addr.lba=0; + while( ioctl( fdi, CDROMREADAUDIO, &sr ) != -1 ) + { + pcm_writei( pcm, buff, SIZE*FRAMES/4 ); + sr.addr.lba+=FRAMES; + } + + pcm_close( pcm ); + close( fdi ); + return 0; +err1: + close( fdi ); +err0: + return 1; +}