Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/build-cnfa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
vim
gettext-base
libasound2-dev
libpulse2-dev
libpulse-dev
- name: Check out respository code
uses: actions/checkout@v3
with:
Expand All @@ -33,7 +33,7 @@ jobs:
# run: |
# git_hash=$(git rev-parse --short "$GITHUB_SHA")
# git commit -m "Updating CNFA_sf.h to ${git_hash}" CNFA_sf.h
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: cnfa_sf
path: CNFA_sf.h
Expand All @@ -51,7 +51,7 @@ jobs:
rm CNFA_sf.h
make CNFA_sf.h
make
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: cnfa_sf
path: CNFA_sf.h
11 changes: 6 additions & 5 deletions CNFA.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ void RegCNFADriver( int priority, const char * name, CNFAInitFn * fn );
#define CNFA_SUN 1
#elif defined(__linux) || defined(__linux__) || defined(linux) || defined(__LINUX__)
#define CNFA_LINUX 1
#define CNFA_PULSE 1
#endif

#if defined(PULSEAUDIO)
Expand All @@ -115,11 +116,11 @@ void RegCNFADriver( int priority, const char * name, CNFAInitFn * fn );
#include "CNFA.c"
#include "CNFA_null.c"
#if CNFA_WINDOWS
#include "CNFA_winmm.c"
#include <ntverp.h> // This probably won't work on pre-NT systems
#if VER_PRODUCTBUILD >= 7601
#include "CNFA_wasapi.c"
#endif
#include "CNFA_winmm.c"
#include <ntverp.h> // This probably won't work on pre-NT systems
#if VER_PRODUCTBUILD >= 7601
#include "CNFA_wasapi.c"
#endif
#elif CNFA_ANDROID
#include "CNFA_android.c"
#elif CNFA_SUN
Expand Down
70 changes: 35 additions & 35 deletions CNFA_alsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include <alsa/asoundlib.h>
#include <string.h>

#define ALSA_PRINT_PREFIX "[CNFA][ALSA]: "

struct CNFADriverAlsa
{
void (*CloseFn)( void * object );
Expand Down Expand Up @@ -64,45 +66,45 @@ static int SetHWParams( snd_pcm_t * handle, int * samplerate, short * channels,
int dir;
snd_pcm_hw_params_t *hw_params;
if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) {
fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot allocate hardware parameter structure (%s)\n",
snd_strerror (err));
return -1;
}

if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) {
fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot initialize hardware parameter structure (%s)\n",
snd_strerror (err));
goto fail;
}

if ((err = snd_pcm_hw_params_set_access (handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
fprintf (stderr, "cannot set access type (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set access type (%s)\n",
snd_strerror (err));
goto fail;
}

if ((err = snd_pcm_hw_params_set_format (handle, hw_params, SND_PCM_FORMAT_S16_LE )) < 0) {
fprintf (stderr, "cannot set sample format (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set sample format (%s)\n",
snd_strerror (err));
goto fail;
}

if ((err = snd_pcm_hw_params_set_rate_near (handle, hw_params, (unsigned int*)samplerate, 0)) < 0) {
fprintf (stderr, "cannot set sample rate (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set sample rate (%s)\n",
snd_strerror (err));
goto fail;
}

if ((err = snd_pcm_hw_params_set_channels (handle, hw_params, *channels)) < 0) {
fprintf (stderr, "cannot set channel count (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set channel count (%s)\n",
snd_strerror (err));
goto fail;
}

dir = 0;
if( (err = snd_pcm_hw_params_set_period_size_near(handle, hw_params, bufsize, &dir)) < 0 )
{
fprintf( stderr, "cannot set period size. (%s)\n",
fprintf( stderr, ALSA_PRINT_PREFIX"cannot set period size. (%s)\n",
snd_strerror(err) );
goto fail;
}
Expand All @@ -111,14 +113,14 @@ static int SetHWParams( snd_pcm_t * handle, int * samplerate, short * channels,
bufs = *bufsize*3;
if( (err = snd_pcm_hw_params_set_buffer_size(handle, hw_params, bufs)) < 0 )
{
fprintf( stderr, "cannot set snd_pcm_hw_params_set_buffer_size size. (%s)\n",
fprintf( stderr, ALSA_PRINT_PREFIX"cannot set snd_pcm_hw_params_set_buffer_size size. (%s)\n",
snd_strerror(err) );
goto fail;
}


if ((err = snd_pcm_hw_params (handle, hw_params)) < 0) {
fprintf (stderr, "cannot set parameters (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set parameters (%s)\n",
snd_strerror (err));
goto fail;
}
Expand All @@ -140,37 +142,37 @@ static int SetSWParams( struct CNFADriverAlsa * d, snd_pcm_t * handle, int isrec
if( !isrec )
{
if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) {
fprintf (stderr, "cannot allocate software parameters structure (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot allocate software parameters structure (%s)\n",
snd_strerror (err));
goto failhard;
}
if ((err = snd_pcm_sw_params_current (handle, sw_params)) < 0) {
fprintf (stderr, "cannot initialize software parameters structure (%s) (%p)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot initialize software parameters structure (%s) (%p)\n",
snd_strerror (err), handle);
goto fail;
}

int buffer_size = d->bufsize*3;
int period_size = d->bufsize;
printf( "PERIOD: %d BUFFER: %d\n", period_size, buffer_size );
printf( ALSA_PRINT_PREFIX"PERIOD: %d BUFFER: %d\n", period_size, buffer_size );

if ((err = snd_pcm_sw_params_set_avail_min (handle, sw_params, period_size )) < 0) {
fprintf (stderr, "cannot set minimum available count (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set minimum available count (%s)\n",
snd_strerror (err));
goto fail;
}
//if ((err = snd_pcm_sw_params_set_stop_threshold(handle, sw_params, 512 )) < 0) {
// fprintf (stderr, "cannot set minimum available count (%s)\n",
// fprintf (stderr, ALSA_PRINT_PREFIX"cannot set minimum available count (%s)\n",
// snd_strerror (err));
// goto fail;
//}
if ((err = snd_pcm_sw_params_set_start_threshold(handle, sw_params, buffer_size - period_size )) < 0) {
fprintf (stderr, "cannot set minimum available count (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set minimum available count (%s)\n",
snd_strerror (err));
goto fail;
}
if ((err = snd_pcm_sw_params (handle, sw_params)) < 0) {
fprintf (stderr, "cannot set software parameters (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot set software parameters (%s)\n",
snd_strerror (err));
goto fail;
}
Expand All @@ -180,7 +182,7 @@ static int SetSWParams( struct CNFADriverAlsa * d, snd_pcm_t * handle, int isrec
}

if ((err = snd_pcm_prepare (handle)) < 0) {
fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
fprintf (stderr, ALSA_PRINT_PREFIX"cannot prepare audio interface for use (%s)\n",
snd_strerror (err));
goto fail;
}
Expand All @@ -205,18 +207,18 @@ void * RecThread( void * v )
int err = snd_pcm_readi( r->record_handle, samples, r->bufsize );
if( err < 0 )
{
fprintf( stderr, "Warning: ALSA Recording Failed\n" );
fprintf( stderr, ALSA_PRINT_PREFIX"Warning: ALSA Recording Failed\n" );
break;
}
if( err != r->bufsize )
{
fprintf( stderr, "Warning: ALSA Recording Underflow\n" );
fprintf( stderr, ALSA_PRINT_PREFIX"Warning: ALSA Recording Underflow\n" );
}
r->recording = 1;
r->callback( (struct CNFADriver *)r, 0, samples, 0, err );
} while( 1 );
r->recording = 0;
fprintf( stderr, "ALSA Recording Stopped\n" );
fprintf( stderr, ALSA_PRINT_PREFIX"ALSA Recording Stopped\n" );
return 0;
}

Expand All @@ -234,45 +236,43 @@ void * PlayThread( void * v )
while( err >= 0 )
{
// int avail = snd_pcm_avail(r->playback_handle);
// printf( "avail: %d\n", avail );
// printf( ALSA_PRINT_PREFIX"avail: %d\n", avail );
r->callback( (struct CNFADriver *)r, samples, 0, r->bufsize, 0 );
err = snd_pcm_writei(r->playback_handle, samples, r->bufsize);
if( err != r->bufsize )
{
fprintf( stderr, "Warning: ALSA Playback Overflow\n" );
fprintf( stderr, ALSA_PRINT_PREFIX"Warning: ALSA Playback Overflow\n" );
}
r->playing = 1;
}
r->playing = 0;
fprintf( stderr, "ALSA Playback Stopped\n" );
fprintf( stderr, ALSA_PRINT_PREFIX"Playback Stopped\n" );
return 0;
}

static struct CNFADriverAlsa * InitALSA( struct CNFADriverAlsa * r )
{
printf( "CNFA Alsa Init %p %p (%d %d) %d %d\n", r->playback_handle, r->record_handle, r->spsPlay, r->spsRec, r->channelsPlay, r->channelsRec );
printf( ALSA_PRINT_PREFIX"initialized %p %p (%d %d) %d %d\n", r->playback_handle, r->record_handle, r->spsPlay, r->spsRec, r->channelsPlay, r->channelsRec );

int err;
if( r->channelsPlay )
{
if ((err = snd_pcm_open (&r->playback_handle, r->devPlay?r->devPlay:"default", SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
fprintf (stderr, "cannot open output audio device (%s)\n",
if ((err = snd_pcm_open (&r->playback_handle, r->devPlay?r->devPlay:"hw:0,0", SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
fprintf (stderr, ALSA_PRINT_PREFIX"cannot open output audio device (%s)\n",
snd_strerror (err));
goto fail;
}
}

if( r->channelsRec )
{
if ((err = snd_pcm_open (&r->record_handle, r->devRec?r->devRec:"default", SND_PCM_STREAM_CAPTURE, 0)) < 0) {
fprintf (stderr, "cannot open input audio device (%s)\n",
if ((err = snd_pcm_open (&r->record_handle, r->devRec?r->devRec:"hw:0,0", SND_PCM_STREAM_CAPTURE, 0)) < 0) {
fprintf (stderr, ALSA_PRINT_PREFIX"cannot open input audio device (%s)\n",
snd_strerror (err));
goto fail;
}
}

printf( "%p %p\n", r->playback_handle, r->record_handle );

if( r->playback_handle )
{
if( SetHWParams( r->playback_handle, &r->spsPlay, &r->channelsPlay, &r->bufsize, r ) < 0 )
Expand All @@ -297,7 +297,7 @@ static struct CNFADriverAlsa * InitALSA( struct CNFADriverAlsa * r )
err = snd_async_add_pcm_handler(&pcm_callback, r->playback_handle, playback_callback, r);
if(err < 0)
{
printf("Playback callback handler error: %s\n", snd_strerror(err));
printf(ALSA_PRINT_PREFIX"Playback callback handler error: %s\n", snd_strerror(err));
}
}

Expand All @@ -308,7 +308,7 @@ static struct CNFADriverAlsa * InitALSA( struct CNFADriverAlsa * r )
err = snd_async_add_pcm_handler(&pcm_callback, r->record_handle, record_callback, r);
if(err < 0)
{
printf("Record callback handler error: %s\n", snd_strerror(err));
printf(ALSA_PRINT_PREFIX"Record callback handler error: %s\n", snd_strerror(err));
}
}
#endif
Expand All @@ -318,7 +318,7 @@ static struct CNFADriverAlsa * InitALSA( struct CNFADriverAlsa * r )
err = snd_pcm_link ( r->playback_handle, r->record_handle );
if(err < 0)
{
printf("snd_pcm_link error: %s\n", snd_strerror(err));
printf(ALSA_PRINT_PREFIX"snd_pcm_link error: %s\n", snd_strerror(err));
}
}

Expand All @@ -332,7 +332,7 @@ static struct CNFADriverAlsa * InitALSA( struct CNFADriverAlsa * r )
r->threadRec = OGCreateThread( RecThread, r );
}

printf( "CNFA Alsa Init Out -> %p %p (%d %d) %d %d\n", r->playback_handle, r->record_handle, r->spsPlay, r->spsRec, r->channelsPlay, r->channelsRec );
printf( ALSA_PRINT_PREFIX"Init Out -> %p %p (%d %d) %d %d\n", r->playback_handle, r->record_handle, r->spsPlay, r->spsRec, r->channelsPlay, r->channelsRec );

return r;

Expand All @@ -343,7 +343,7 @@ static struct CNFADriverAlsa * InitALSA( struct CNFADriverAlsa * r )
if( r->record_handle ) snd_pcm_close (r->record_handle);
free( r );
}
fprintf( stderr, "Error: ALSA failed to start.\n" );
fprintf( stderr, ALSA_PRINT_PREFIX"ALSA failed to start.\n" );
return 0;
}

Expand Down
Loading
Loading