From 75c7e6277695c2f0cb5aa41f7b6d9b5ef43946f8 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 14 Feb 2003 19:26:35 +0000 Subject: [PATCH] Code cleanups --- src/pcm/pcm_jack.c | 233 ++++++++++++++++++++++++++++----------------- 1 file changed, 145 insertions(+), 88 deletions(-) diff --git a/src/pcm/pcm_jack.c b/src/pcm/pcm_jack.c index 28efddce..fea11cbf 100644 --- a/src/pcm/pcm_jack.c +++ b/src/pcm/pcm_jack.c @@ -40,6 +40,18 @@ #include #endif +#if 1 +#define JACK_PLAYBACK_PORT1 "alsa_pcm:playback_1" +#define JACK_PLAYBACK_PORT2 "alsa_pcm:playback_2" +#define JACK_CAPTURE_PORT1 "alsa_pcm:capture_1" +#define JACK_CAPTURE_PORT2 "alsa_pcm:capture_2" +#else +#define JACK_PLAYBACK_PORT1 "alsa_pcm:out_1" +#define JACK_PLAYBACK_PORT2 "alsa_pcm:out_2" +#define JACK_CAPTURE_PORT1 "alsa_pcm:in_1" +#define JACK_CAPTURE_PORT2 "alsa_pcm:in_2" +#endif + #define PCM_JACK_DEBUG #ifndef PIC @@ -54,14 +66,16 @@ typedef enum _jack_format { } snd_pcm_jack_format_t; typedef struct { - char *fname; int fd; - int format; + int activated; /* jack is activated? */ snd_timestamp_t trigger_tstamp; + snd_pcm_uframes_t avail_max; snd_pcm_state_t state; snd_pcm_uframes_t appl_ptr; snd_pcm_uframes_t hw_ptr; + unsigned int channels; + #ifdef USE_JACK jack_port_t **ports; jack_client_t *client; @@ -86,16 +100,15 @@ static int snd_pcm_jack_close(snd_pcm_t *pcm) return err; } -static int snd_pcm_jack_nonblock(snd_pcm_t *pcm, int nonblock) +static int snd_pcm_jack_nonblock(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int nonblock ATTRIBUTE_UNUSED) { - snd_pcm_jack_t *jack = pcm->private_data; #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_nonblock\n"); fflush(stdout); #endif return 0; } -static int snd_pcm_jack_async(snd_pcm_t *pcm, int sig, pid_t pid) +static int snd_pcm_jack_async(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int sig ATTRIBUTE_UNUSED, pid_t pid ATTRIBUTE_UNUSED) { #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_async\n"); fflush(stdout); @@ -103,10 +116,9 @@ static int snd_pcm_jack_async(snd_pcm_t *pcm, int sig, pid_t pid) return -ENOSYS; } -static int snd_pcm_jack_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents) +static int snd_pcm_jack_poll_revents(snd_pcm_t *pcm ATTRIBUTE_UNUSED, struct pollfd *pfds, unsigned int nfds, unsigned short *revents) { - snd_pcm_jack_t *jack = pcm->private_data; - unsigned short events; + // snd_pcm_jack_t *jack = pcm->private_data; char buf[1]; #ifdef PCM_JACK_DEBUG @@ -138,7 +150,7 @@ static int snd_pcm_jack_info(snd_pcm_t *pcm, snd_pcm_info_t * info) static int snd_pcm_jack_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t * info) { - snd_pcm_jack_t *jack = pcm->private_data; + // snd_pcm_jack_t *jack = pcm->private_data; #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_channel_info\n"); fflush(stdout); #endif @@ -156,7 +168,7 @@ static int snd_pcm_jack_status(snd_pcm_t *pcm, snd_pcm_status_t * status) status->trigger_tstamp = jack->trigger_tstamp; gettimeofday(&status->tstamp, 0); status->avail = pcm->buffer_size; - status->avail_max = status->avail; + status->avail_max = jack->avail_max; return 0; } @@ -192,7 +204,7 @@ snd_pcm_jack_process_cb (jack_nframes_t nframes, snd_pcm_t *pcm) { snd_pcm_jack_t *jack = pcm->private_data; const snd_pcm_channel_area_t *areas; - snd_pcm_uframes_t xfer = 0; + snd_pcm_uframes_t xfer = 0, samples; snd_pcm_channel_area_t area; char buf[1]; @@ -203,7 +215,13 @@ snd_pcm_jack_process_cb (jack_nframes_t nframes, snd_pcm_t *pcm) area.addr = jack_port_get_buffer (jack->ports[0], nframes); area.first = 0; area.step = pcm->sample_bits; - + + if (jack->state != SND_PCM_STATE_RUNNING) { + if (pcm->stream == SND_PCM_STREAM_PLAYBACK) + snd_pcm_area_silence(&area, 0, nframes, pcm->format); + return 0; + } + areas = snd_pcm_mmap_areas(pcm); while (xfer < nframes) @@ -217,8 +235,8 @@ snd_pcm_jack_process_cb (jack_nframes_t nframes, snd_pcm_t *pcm) #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_process_cb hw=%d=%d + nframes=%d / frames=%d / bufsize=%d\n", + (int)offset,(int)jack->hw_ptr,(int)nframes,(int)frames,(int)pcm->buffer_size); fflush(stdout); #endif - offset,jack->hw_ptr,nframes,frames,pcm->buffer_size); fflush(stdout); if (pcm->stream == SND_PCM_STREAM_PLAYBACK) { snd_pcm_area_copy(&area, xfer, &areas[0], offset, frames, pcm->format); @@ -229,10 +247,20 @@ snd_pcm_jack_process_cb (jack_nframes_t nframes, snd_pcm_t *pcm) snd_pcm_mmap_hw_forward(pcm,frames); xfer += frames; } + + if (pcm->stop_threshold < pcm->boundary) { + samples = snd_pcm_mmap_avail(pcm); + if (samples >= pcm->stop_threshold) { + gettimeofday(&jack->trigger_tstamp, 0); + jack->state = SND_PCM_STATE_XRUN; + jack->avail_max = samples; + } + } + write(jack->fd,buf,1); /* for polling */ #ifdef PCM_JACK_DEBUG - printf("jack_process = %d\n",snd_pcm_mmap_hw_offset(pcm)); fflush(stdout); + printf("jack_process = %d\n",(int)snd_pcm_mmap_hw_offset(pcm)); fflush(stdout); #endif return 0; @@ -241,8 +269,8 @@ snd_pcm_jack_process_cb (jack_nframes_t nframes, snd_pcm_t *pcm) static int snd_pcm_jack_prepare(snd_pcm_t *pcm) { - int i; - + unsigned int i; + snd_pcm_jack_t *jack = pcm->private_data; #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_prepare\n"); fflush(stdout); @@ -272,48 +300,74 @@ static int snd_pcm_jack_prepare(snd_pcm_t *pcm) jack_set_process_callback (jack->client, (JackProcessCallback)snd_pcm_jack_process_cb, pcm); - jack_activate (jack->client); + return 0; +} + +static int snd_pcm_jack_reset(snd_pcm_t *pcm) +{ +#ifdef PCM_JACK_DEBUG + printf("snd_pcm_jack_reset\n"); fflush(stdout); +#endif + *pcm->appl.ptr = 0; + *pcm->hw.ptr = 0; + return 0; +} + +static int snd_pcm_jack_start(snd_pcm_t *pcm) +{ + snd_pcm_jack_t *jack = pcm->private_data; + unsigned int i; + + assert(jack->state == SND_PCM_STATE_PREPARED); + +#ifdef PCM_JACK_DEBUG + printf("snd_pcm_jack_start\n"); fflush(stdout); +#endif + + if (jack_activate (jack->client)) + return -EIO; + jack->activated = 1; if (pcm->stream == SND_PCM_STREAM_PLAYBACK) { for (i = 0; i < pcm->channels; i++) { - if (jack_connect (jack->client, jack_port_name (jack->ports[i]), "alsa_pcm:playback_1")) + if (jack_connect (jack->client, jack_port_name (jack->ports[i]), JACK_PLAYBACK_PORT1)) { fprintf (stderr, "cannot connect output ports\n"); - exit(-1); + return -EIO; }else{ #ifdef PCM_JACK_DEBUG printf("connected %s to alsa_pcm:playback_1",jack_port_name(jack->ports[i])); #endif } - if (jack_connect (jack->client, jack_port_name (jack->ports[i]),"alsa_pcm:playback_2")) + if (jack_connect (jack->client, jack_port_name (jack->ports[i]),JACK_PLAYBACK_PORT2)) { fprintf (stderr, "cannot connect output ports\n"); - exit(-1); + return -EIO; }else{ #ifdef PCM_JACK_DEBUG printf("connected %s to alsa_pcm:playback_2",jack_port_name(jack->ports[i])); #endif } } - }else{ + } else { for (i = 0; i < pcm->channels; i++) { if (jack_connect (jack->client, - "alsa_pcm:capture_1",jack_port_name (jack->ports[i]))) + JACK_CAPTURE_PORT1,jack_port_name (jack->ports[i]))) { fprintf (stderr, "cannot connect input ports\n"); - exit(-1); + return -EIO; }else{ #ifdef PCM_JACK_DEBUG printf("connected %s to alsa_pcm:capture_1",jack_port_name(jack->ports[i])); #endif } if (jack_connect (jack->client, - "alsa_pcm:capture_2",jack_port_name (jack->ports[i]))) + JACK_CAPTURE_PORT2,jack_port_name (jack->ports[i]))) { fprintf (stderr, "cannot connect input ports\n"); - exit(-1); + return -EIO; }else{ #ifdef PCM_JACK_DEBUG printf("connected %s to alsa_pcm:capture_2",jack_port_name(jack->ports[i])); @@ -322,28 +376,6 @@ static int snd_pcm_jack_prepare(snd_pcm_t *pcm) } } #endif - - return 0; -} - -static int snd_pcm_jack_reset(snd_pcm_t *pcm) -{ -#ifdef PCM_JACK_DEBUG - printf("snd_pcm_jack_reset\n"); fflush(stdout); -#endif - *pcm->appl.ptr = 0; - *pcm->hw.ptr = 0; - return 0; -} - -static int snd_pcm_jack_start(snd_pcm_t *pcm) -{ - snd_pcm_jack_t *jack = pcm->private_data; - assert(jack->state == SND_PCM_STATE_PREPARED); - -#ifdef PCM_JACK_DEBUG - printf("snd_pcm_jack_start\n"); fflush(stdout); -#endif jack->state = SND_PCM_STATE_RUNNING; @@ -353,10 +385,26 @@ static int snd_pcm_jack_start(snd_pcm_t *pcm) static int snd_pcm_jack_drop(snd_pcm_t *pcm) { snd_pcm_jack_t *jack = pcm->private_data; + unsigned int i; + #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_drop\n"); fflush(stdout); #endif assert(jack->state != SND_PCM_STATE_OPEN); +#if 0 + if (jack->activated) { + printf("deactivate\n"); + jack_deactivate(jack->client); + printf("deactivate done\n"); + jack->activated = 0; + } + for (i = 0; i < pcm->channels; i++) { + if (jack->ports[i]) { + jack_port_unregister(jack->client, jack->ports[i]); + jack->ports[i] = NULL; + } + } +#endif jack->state = SND_PCM_STATE_SETUP; return 0; } @@ -368,8 +416,7 @@ static int snd_pcm_jack_drain(snd_pcm_t *pcm) printf("snd_pcm_jack_drain\n"); fflush(stdout); #endif assert(jack->state != SND_PCM_STATE_OPEN); - jack->state = SND_PCM_STATE_SETUP; - return 0; + return snd_pcm_jack_drop(pcm); } static int snd_pcm_jack_pause(snd_pcm_t *pcm, int enable) @@ -381,30 +428,31 @@ static int snd_pcm_jack_pause(snd_pcm_t *pcm, int enable) if (enable) { if (jack->state != SND_PCM_STATE_RUNNING) return -EBADFD; - } else if (jack->state != SND_PCM_STATE_PAUSED) - return -EBADFD; - jack->state = SND_PCM_STATE_PAUSED; + jack->state = SND_PCM_STATE_PAUSED; + } else { + if (jack->state != SND_PCM_STATE_PAUSED) + return -EBADFD; + jack->state = SND_PCM_STATE_RUNNING; + } return 0; } static snd_pcm_sframes_t snd_pcm_jack_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames) { - snd_pcm_jack_t *jack = pcm->private_data; - snd_pcm_uframes_t n = snd_pcm_frames_to_bytes(pcm, frames); - snd_pcm_sframes_t ptr; #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_rewind\n"); fflush(stdout); #endif - return n; + snd_pcm_mmap_appl_backward(pcm, frames); + return frames; } -static int snd_pcm_jack_resume(snd_pcm_t *pcm) +static int snd_pcm_jack_resume(snd_pcm_t *pcm ATTRIBUTE_UNUSED) { return 0; } static snd_pcm_sframes_t snd_pcm_jack_mmap_commit(snd_pcm_t *pcm, - snd_pcm_uframes_t offset, + snd_pcm_uframes_t offset ATTRIBUTE_UNUSED, snd_pcm_uframes_t size) { snd_pcm_mmap_appl_forward(pcm, size); @@ -414,9 +462,9 @@ static snd_pcm_sframes_t snd_pcm_jack_mmap_commit(snd_pcm_t *pcm, static snd_pcm_sframes_t snd_pcm_jack_avail_update(snd_pcm_t *pcm) { snd_pcm_jack_t *jack = pcm->private_data; - int ret = snd_pcm_mmap_avail(pcm); + snd_pcm_sframes_t ret = snd_pcm_mmap_avail(pcm); #ifdef PCM_JACK_DEBUG - printf("snd_pcm_jack_avail_update appl=%d hw=%d ret=%d\n",jack->appl_ptr,jack->hw_ptr,ret); fflush(stdout); + printf("snd_pcm_jack_avail_update appl=%d hw=%d ret=%d\n",(int)jack->appl_ptr,(int)jack->hw_ptr,(int)ret); fflush(stdout); #endif return ret; } @@ -437,49 +485,57 @@ static int snd_pcm_jack_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) { int err; snd_pcm_jack_t *jack = pcm->private_data; - static snd_mask_t access = { .bits = { (1<client); - - snd_mask_refine(hw_param_mask(params, SND_PCM_HW_PARAM_ACCESS), &access); - - snd_mask_refine(hw_param_mask(params, SND_PCM_HW_PARAM_FORMAT), - &format_mask); - snd_interval_refine(hw_param_interval(params,SND_PCM_HW_PARAM_RATE),&t); + err = snd_mask_refine(hw_param_mask(params, SND_PCM_HW_PARAM_ACCESS), &access); + if (err < 0) + return err; + err = snd_mask_refine(hw_param_mask(params, SND_PCM_HW_PARAM_FORMAT), &format_mask); + if (err < 0) + return err; + err = snd_interval_refine_set(hw_param_interval(params, SND_PCM_HW_PARAM_CHANNELS), jack->channels); + if (err < 0) + return err; + err = snd_interval_refine_set(hw_param_interval(params, SND_PCM_HW_PARAM_RATE), jack_get_sample_rate(jack->client)); + if (err < 0) + return err; + /* limit to something useful */ + snd_interval_set_minmax(&t, 128, 1024*1024); + err = snd_interval_refine(hw_param_interval(params, SND_PCM_HW_PARAM_BUFFER_SIZE), &t); + if (err < 0) + return err; + snd_interval_set_minmax(&t, 64, 1024*1024); + err = snd_interval_refine(hw_param_interval(params, SND_PCM_HW_PARAM_PERIOD_SIZE), &t); + if (err < 0) + return err; + snd_interval_set_minmax(&t, 2, 64); + err = snd_interval_refine(hw_param_interval(params, SND_PCM_HW_PARAM_PERIODS), &t); + if (err < 0) + return err; return 0; } -static int snd_pcm_jack_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params) +static int snd_pcm_jack_hw_params(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t * params ATTRIBUTE_UNUSED) { - snd_pcm_jack_t *jack = pcm->private_data; - int err; - #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_hw_params\n"); fflush(stdout); #endif - return 0; } -static int snd_pcm_jack_hw_free(snd_pcm_t *pcm) +static int snd_pcm_jack_hw_free(snd_pcm_t *pcm ATTRIBUTE_UNUSED) { #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_hw_free\n"); fflush(stdout); @@ -487,7 +543,7 @@ static int snd_pcm_jack_hw_free(snd_pcm_t *pcm) return 0; } -static int snd_pcm_jack_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params) +static int snd_pcm_jack_sw_params(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t * params ATTRIBUTE_UNUSED) { #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_sw_params\n"); fflush(stdout); @@ -495,9 +551,9 @@ static int snd_pcm_jack_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params) return 0; } -static int snd_pcm_jack_mmap(snd_pcm_t *pcm) +static int snd_pcm_jack_mmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED) { - snd_pcm_jack_t *jack = pcm->private_data; + // snd_pcm_jack_t *jack = pcm->private_data; #ifdef PCM_JACK_DEBUG printf("snd_pcm_jack_mmap\n"); fflush(stdout); #endif @@ -505,16 +561,16 @@ static int snd_pcm_jack_mmap(snd_pcm_t *pcm) return 0; } -static int snd_pcm_jack_munmap(snd_pcm_t *pcm) +static int snd_pcm_jack_munmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED) { - snd_pcm_jack_t *jack = pcm->private_data; + // snd_pcm_jack_t *jack = pcm->private_data; return 0; } static void snd_pcm_jack_dump(snd_pcm_t *pcm, snd_output_t *out) { - snd_pcm_jack_t *jack = pcm->private_data; - snd_output_printf(out, "Jack PCM\n", jack->fname); + // snd_pcm_jack_t *jack = pcm->private_data; + snd_output_printf(out, "Jack PCM\n"); if (pcm->setup) { snd_output_printf(out, "Its setup is:\n"); snd_pcm_dump_setup(pcm, out); @@ -583,6 +639,7 @@ int snd_pcm_jack_open(snd_pcm_t **pcmp, const char *name, if (!jack) { return -ENOMEM; } + jack->channels = 2; /* FIXME: should be configurable */ #ifdef USE_JACK if (stream == SND_PCM_STREAM_PLAYBACK) -- 2.47.1