First commit: Working cdplayer for linux using tinyalsa
This commit is contained in:
5
LICENSE
Normal file
5
LICENSE
Normal 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
18
README
Normal 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
130
cdplayer.c
Normal 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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user