diff options
Diffstat (limited to 'src/output/oss_output_plugin.c')
-rw-r--r-- | src/output/oss_output_plugin.c | 105 |
1 files changed, 30 insertions, 75 deletions
diff --git a/src/output/oss_output_plugin.c b/src/output/oss_output_plugin.c index aa9c00fc..84b1b485 100644 --- a/src/output/oss_output_plugin.c +++ b/src/output/oss_output_plugin.c @@ -26,6 +26,8 @@ #include <glib.h> +#include <libavutil/samplefmt.h> + #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> @@ -427,85 +429,57 @@ oss_setup_sample_rate(int fd, struct audio_format *audio_format, * AFMT_QUERY if there is no direct counterpart. */ static int -sample_format_to_oss(enum sample_format format) +sample_format_to_oss(enum AVSampleFormat format) { switch (format) { - case SAMPLE_FORMAT_UNDEFINED: - case SAMPLE_FORMAT_FLOAT: - return AFMT_QUERY; - - case SAMPLE_FORMAT_S8: - return AFMT_S8; - - case SAMPLE_FORMAT_S16: + case AV_SAMPLE_FMT_U8: + return AFMT_U8; + case AV_SAMPLE_FMT_S16: return AFMT_S16_NE; - - case SAMPLE_FORMAT_S24_P32: -#ifdef AFMT_S24_NE - return AFMT_S24_NE; -#else - return AFMT_QUERY; -#endif - - case SAMPLE_FORMAT_S32: + case AV_SAMPLE_FMT_S32: #ifdef AFMT_S32_NE return AFMT_S32_NE; #else return AFMT_QUERY; #endif + default: + return AFMT_QUERY; } return AFMT_QUERY; } /** - * Convert an OSS sample format to its MPD counterpart. Returns - * SAMPLE_FORMAT_UNDEFINED if there is no direct counterpart. + * Convert an OSS sample format to its libav counterpart. Returns + * AV_SAMPLE_FMT_NONE if there is no direct counterpart. */ -static enum sample_format +static enum AVSampleFormat sample_format_from_oss(int format) { switch (format) { - case AFMT_S8: - return SAMPLE_FORMAT_S8; - + case AFMT_U8: + return AV_SAMPLE_FMT_U8; case AFMT_S16_NE: - return SAMPLE_FORMAT_S16; - -#ifdef AFMT_S24_PACKED - case AFMT_S24_PACKED: - return SAMPLE_FORMAT_S24_P32; -#endif - -#ifdef AFMT_S24_NE - case AFMT_S24_NE: - return SAMPLE_FORMAT_S24_P32; -#endif - + return AV_SAMPLE_FMT_S16; #ifdef AFMT_S32_NE case AFMT_S32_NE: - return SAMPLE_FORMAT_S32; + return AV_SAMPLE_FMT_S32; #endif - default: - return SAMPLE_FORMAT_UNDEFINED; + return AV_SAMPLE_FMT_NONE; } } /** * Probe one sample format. - * - * @return the selected sample format or SAMPLE_FORMAT_UNDEFINED on - * error */ -static enum oss_setup_result -oss_probe_sample_format(int fd, enum sample_format sample_format, - enum sample_format *sample_format_r, - int *oss_format_r, +static enum oss_setup_result oss_probe_sample_format(int fd, enum AVSampleFormat sample_format, + enum AVSampleFormat *sample_format_r, + int *oss_format_r, #ifdef AFMT_S24_PACKED - struct pcm_export_state *export, + struct pcm_export_state *export, #endif - GError **error_r) + GError **error_r) { int oss_format = sample_format_to_oss(sample_format); if (oss_format == AFMT_QUERY) @@ -516,34 +490,16 @@ oss_probe_sample_format(int fd, enum sample_format sample_format, &oss_format, "Failed to set sample format", error_r); -#ifdef AFMT_S24_PACKED - if (result == UNSUPPORTED && sample_format == SAMPLE_FORMAT_S24_P32) { - /* if the driver doesn't support padded 24 bit, try - packed 24 bit */ - oss_format = AFMT_S24_PACKED; - result = oss_try_ioctl_r(fd, SNDCTL_DSP_SAMPLESIZE, - &oss_format, - "Failed to set sample format", error_r); - } -#endif - if (result != SUCCESS) return result; sample_format = sample_format_from_oss(oss_format); - if (sample_format == SAMPLE_FORMAT_UNDEFINED) + if (sample_format == AV_SAMPLE_FMT_NONE) return UNSUPPORTED; *sample_format_r = sample_format; *oss_format_r = oss_format; -#ifdef AFMT_S24_PACKED - pcm_export_open(export, sample_format, false, - oss_format == AFMT_S24_PACKED, - oss_format == AFMT_S24_PACKED && - G_BYTE_ORDER != G_LITTLE_ENDIAN); -#endif - return SUCCESS; } @@ -559,7 +515,7 @@ oss_setup_sample_format(int fd, struct audio_format *audio_format, #endif GError **error_r) { - enum sample_format mpd_format; + enum AVSampleFormat mpd_format; enum oss_setup_result result = oss_probe_sample_format(fd, audio_format->format, &mpd_format, oss_format_r, @@ -585,15 +541,14 @@ oss_setup_sample_format(int fd, struct audio_format *audio_format, /* the requested sample format is not available - probe for other formats supported by MPD */ - static const enum sample_format sample_formats[] = { - SAMPLE_FORMAT_S24_P32, - SAMPLE_FORMAT_S32, - SAMPLE_FORMAT_S16, - SAMPLE_FORMAT_S8, - SAMPLE_FORMAT_UNDEFINED /* sentinel */ + static const enum AVSampleFormat sample_formats[] = { + AV_SAMPLE_FMT_S32, + AV_SAMPLE_FMT_S16, + AV_SAMPLE_FMT_U8, + AV_SAMPLE_FMT_NONE /* sentinel */ }; - for (unsigned i = 0; sample_formats[i] != SAMPLE_FORMAT_UNDEFINED; ++i) { + for (unsigned i = 0; sample_formats[i] != AV_SAMPLE_FMT_NONE; ++i) { mpd_format = sample_formats[i]; if (mpd_format == audio_format->format) /* don't try that again */ |