First commit: Working cdplayer for linux using tinyalsa

This commit is contained in:
pedroediaz
2023-12-17 13:09:51 +06:00
commit 0061d8dda9
3 changed files with 153 additions and 0 deletions

5
LICENSE Normal file
View File

@@ -0,0 +1,5 @@
Copyright (c) 2023 by PedroEdiaz <ppedroediaz (at) gmail.com>.
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.

18
README Normal file
View File

@@ -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 (<card>) (<device>) // play cd
kill -USR1 <proc> // Seek a minute forward
kill -USR2 <proc> // Seek a minute backward
kill -STOP <proc> // Stop
kill -CONT <proc> // Play
LICENSE:
0BSD Copyright (c) 2023 by pedroediaz <ppedroediaz (at) gmail.com>

130
cdplayer.c Normal file
View File

@@ -0,0 +1,130 @@
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#include <tinyalsa/pcm.h>
#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 (<card>) (<device>)" );
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;
}