From: Andre Noll Date: Thu, 29 Jul 2010 18:52:06 +0000 (+0200) Subject: Merge branch 't/bits_per_sample' X-Git-Tag: v0.4.4~8 X-Git-Url: http://git.tuebingen.mpg.de/?a=commitdiff_plain;h=c773ec0d537d239e2eebe2d77a786f0ba49fdc22;hp=-c;p=paraslash.git Merge branch 't/bits_per_sample' --- c773ec0d537d239e2eebe2d77a786f0ba49fdc22 diff --combined aacdec_filter.c index 5b84d07e,2dd68448..1127fc11 --- a/aacdec_filter.c +++ b/aacdec_filter.c @@@ -52,7 -52,7 +52,7 @@@ struct private_aacdec_data /** The number of channels of the current stream. */ unsigned int channels; /** Current sample rate in Hz. */ - unsigned int samplerate; + unsigned int sample_rate; }; static int aacdec_execute(struct btr_node *btrn, const char *cmd, char **result) @@@ -60,19 -60,7 +60,7 @@@ struct filter_node *fn = btr_context(btrn); struct private_aacdec_data *padd = fn->private_data; - if (!strcmp(cmd, "samplerate")) { - if (padd->samplerate == 0) - return -E_BTR_NAVAIL; - *result = make_message("%u", padd->samplerate); - return 1; - } - if (!strcmp(cmd, "channels")) { - if (padd->channels == 0) - return -E_BTR_NAVAIL; - *result = make_message("%u", padd->channels); - return 1; - } - return -ERRNO_TO_PARA_ERROR(ENOTSUP); + return decoder_execute(cmd, padd->sample_rate, padd->channels, result); } static void aacdec_open(struct filter_node *fn) @@@ -112,7 -100,7 +100,7 @@@ next_buffer return; btr_merge(btrn, fn->min_iqs); len = btr_next_buffer(btrn, (char **)&inbuf); - len = PARA_MAX(len, (size_t)8192); + len = PARA_MIN(len, (size_t)8192); consumed = 0; iqs = btr_get_input_queue_size(btrn); if (!padd->initialized) { @@@ -140,10 -128,10 +128,10 @@@ &channels) < 0) goto out; } - padd->samplerate = rate; + padd->sample_rate = rate; padd->channels = channels; PARA_INFO_LOG("rate: %u, channels: %d\n", - padd->samplerate, padd->channels); + padd->sample_rate, padd->channels); padd->initialized = 1; } if (padd->decoder_length > 0) { @@@ -186,8 -174,7 +174,8 @@@ padd->frame_info.bytesconsumed); PARA_ERROR_LOG("%s\n", NeAACDecGetErrorMessage( padd->frame_info.error)); - consumed++; /* catch 21 */ + if (consumed < len) + consumed++; /* catch 21 */ goto success; } padd->error_count = 0; diff --combined alsa_write.c index 559dab25,dfa7a2e1..7f8aae01 --- a/alsa_write.c +++ b/alsa_write.c @@@ -31,9 -31,6 +31,6 @@@ #include "alsa_write.cmdline.h" #include "error.h" - /** always use 16 bit little endian */ - #define FORMAT SND_PCM_FORMAT_S16_LE - /** Data specific to the alsa writer. */ struct private_alsa_write_data { /** The alsa handle */ @@@ -45,10 -42,12 +42,12 @@@ /* Number of frames that fit into the buffer. */ snd_pcm_uframes_t buffer_frames; /** - * The samplerate given by command line option or the decoder + * The sample rate given by command line option or the decoder * of the writer node group. */ - unsigned samplerate; + unsigned sample_rate; + + snd_pcm_format_t sample_format; /** * The number of channels, given by command line option or the * decoder of the writer node group. @@@ -57,6 -56,19 +56,19 @@@ struct timeval drain_barrier; }; + static snd_pcm_format_t get_alsa_pcm_format(enum sample_format sf) + { + switch (sf) { + case SF_S8: return SND_PCM_FORMAT_S8; + case SF_U8: return SND_PCM_FORMAT_U8; + case SF_S16_LE: return SND_PCM_FORMAT_S16_LE; + case SF_S16_BE: return SND_PCM_FORMAT_S16_BE; + case SF_U16_LE: return SND_PCM_FORMAT_U16_LE; + case SF_U16_BE: return SND_PCM_FORMAT_U16_BE; + default: return SND_PCM_FORMAT_S16_LE; + } + } + /* Install PCM software and hardware configuration. */ static int alsa_init(struct private_alsa_write_data *pad, struct alsa_write_args_info *conf) @@@ -80,13 -92,14 +92,14 @@@ if (snd_pcm_hw_params_set_access(pad->handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) return -E_ACCESS_TYPE; - if (snd_pcm_hw_params_set_format(pad->handle, hwparams, FORMAT) < 0) + if (snd_pcm_hw_params_set_format(pad->handle, hwparams, + pad->sample_format) < 0) return -E_SAMPLE_FORMAT; if (snd_pcm_hw_params_set_channels(pad->handle, hwparams, pad->channels) < 0) return -E_CHANNEL_COUNT; if (snd_pcm_hw_params_set_rate_near(pad->handle, hwparams, - &pad->samplerate, NULL) < 0) + &pad->sample_rate, NULL) < 0) return -E_SET_RATE; err = snd_pcm_hw_params_get_buffer_time_max(hwparams, &pad->buffer_time, NULL); @@@ -110,7 -123,7 +123,7 @@@ start_threshold = 1; else start_threshold = PARA_MIN(pad->buffer_frames, - (snd_pcm_uframes_t)pad->samplerate); + (snd_pcm_uframes_t)pad->sample_rate); if (snd_pcm_sw_params_set_start_threshold(pad->handle, swparams, start_threshold) < 0) return -E_START_THRESHOLD; @@@ -120,7 -133,7 +133,7 @@@ return -E_STOP_THRESHOLD; if (snd_pcm_sw_params(pad->handle, swparams) < 0) PARA_WARNING_LOG("unable to install sw params\n"); - pad->bytes_per_frame = snd_pcm_format_physical_width(FORMAT) + pad->bytes_per_frame = snd_pcm_format_physical_width(pad->sample_format) * pad->channels / 8; if (pad->bytes_per_frame <= 0) return -E_PHYSICAL_WIDTH; @@@ -228,28 -241,23 +241,24 @@@ again return; } if (!pad->handle) { - struct alsa_write_args_info *conf = wn->conf; + int32_t val; + if (bytes == 0) /* no data available */ return; - /* defaults */ - pad->samplerate = conf->samplerate_arg; - pad->channels = conf->channels_arg; - if (!conf->samplerate_given) { /* config option trumps btr_exec */ - int32_t rate; - if (get_btr_samplerate(btrn, &rate) >= 0) - pad->samplerate = rate; - } - if (!conf->channels_given) { - int32_t ch; - if (get_btr_channels(btrn, &ch) >= 0) - pad->channels = ch; - } - PARA_INFO_LOG("%d channel(s), %dHz\n", pad->channels, pad->samplerate); + get_btr_sample_rate(btrn, &val); + pad->sample_rate = val; + get_btr_channels(btrn, &val); + pad->channels = val; + get_btr_sample_format(btrn, &val); + pad->sample_format = get_alsa_pcm_format(val); + + PARA_INFO_LOG("%d channel(s), %dHz\n", pad->channels, + pad->sample_rate); ret = alsa_init(pad, wn->conf); if (ret < 0) goto err; wn->min_iqs = pad->bytes_per_frame; + goto again; } frames = bytes / pad->bytes_per_frame; frames = snd_pcm_writei(pad->handle, data, frames);