aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2013-04-23 15:30:50 +0200
committerAnton Khirnov <anton@khirnov.net>2015-02-20 09:18:29 +0100
commit0bbe5ac82ef2845efafbf190044f16712db113b2 (patch)
treeac8745fba01c8a3e902e886f46f90ad56576559f
parentc69c8ffa9ec55c94dee7ce69af26b4edbd61647e (diff)
Switch to Libav sample formats everywhere.
Drop 24bit format for now. It should be restored later by properly distinguishing between internal and packed formats.
-rw-r--r--src/audio_check.c70
-rw-r--r--src/audio_check.h24
-rw-r--r--src/audio_format.c42
-rw-r--r--src/audio_format.h136
-rw-r--r--src/audio_parser.c43
-rw-r--r--src/chunk.c4
-rw-r--r--src/decoder/libav_decoder_plugin.c12
-rw-r--r--src/decoder_api.c3
-rw-r--r--src/decoder_internal.c2
-rw-r--r--src/encoder/flac_encoder.c23
-rw-r--r--src/encoder/lame_encoder.c4
-rw-r--r--src/encoder/twolame_encoder.c4
-rw-r--r--src/encoder/vorbis_encoder.c4
-rw-r--r--src/encoder/wave_encoder.c17
-rw-r--r--src/filter/normalize_filter_plugin.c2
-rw-r--r--src/filter_plugin.c8
-rw-r--r--src/output/alsa_output_plugin.c54
-rw-r--r--src/output/ao_output_plugin.c8
-rw-r--r--src/output/ffado_output_plugin.c5
-rw-r--r--src/output/jack_output_plugin.c15
-rw-r--r--src/output/mvp_output_plugin.c10
-rw-r--r--src/output/openal_output_plugin.c13
-rw-r--r--src/output/oss_output_plugin.c105
-rw-r--r--src/output/osx_output_plugin.c14
-rw-r--r--src/output/pulse_output_plugin.c4
-rw-r--r--src/output/roar_output_plugin.c21
-rw-r--r--src/output/solaris_output_plugin.c4
-rw-r--r--src/output/winmm_output_plugin.c15
-rw-r--r--src/pcm_convert.c2
-rw-r--r--src/pcm_export.c56
-rw-r--r--src/pcm_export.h15
-rw-r--r--src/pcm_mix.c124
-rw-r--r--src/pcm_mix.h8
-rw-r--r--src/pcm_volume.c36
-rw-r--r--src/pcm_volume.h7
-rw-r--r--src/player_thread.c2
36 files changed, 316 insertions, 600 deletions
diff --git a/src/audio_check.c b/src/audio_check.c
index a9aa2dd8..4874e2da 100644
--- a/src/audio_check.c
+++ b/src/audio_check.c
@@ -22,53 +22,53 @@
#include <assert.h>
-bool
-audio_check_sample_rate(unsigned long sample_rate, GError **error_r)
+#include <libavutil/samplefmt.h>
+
+bool audio_check_sample_rate(unsigned long sample_rate, GError **error_r)
{
- if (!audio_valid_sample_rate(sample_rate)) {
- g_set_error(error_r, audio_format_quark(), 0,
- "Invalid sample rate: %lu", sample_rate);
- return false;
- }
+ if (!audio_valid_sample_rate(sample_rate)) {
+ g_set_error(error_r, audio_format_quark(), 0,
+ "Invalid sample rate: %lu", sample_rate);
+ return false;
+ }
- return true;
+ return true;
}
-bool
-audio_check_sample_format(enum sample_format sample_format, GError **error_r)
+ bool
+audio_check_sample_format(enum AVSampleFormat sample_format, GError **error_r)
{
- if (!audio_valid_sample_format(sample_format)) {
- g_set_error(error_r, audio_format_quark(), 0,
- "Invalid sample format: %u", sample_format);
- return false;
- }
+ if (!audio_valid_sample_format(sample_format)) {
+ g_set_error(error_r, audio_format_quark(), 0,
+ "Invalid sample format: %u", sample_format);
+ return false;
+ }
- return true;
+ return true;
}
-bool
+ bool
audio_check_channel_count(unsigned channels, GError **error_r)
{
- if (!audio_valid_channel_count(channels)) {
- g_set_error(error_r, audio_format_quark(), 0,
- "Invalid channel count: %u", channels);
- return false;
- }
+ if (!audio_valid_channel_count(channels)) {
+ g_set_error(error_r, audio_format_quark(), 0,
+ "Invalid channel count: %u", channels);
+ return false;
+ }
- return true;
+ return true;
}
-bool
-audio_format_init_checked(struct audio_format *af, unsigned long sample_rate,
- enum sample_format sample_format, unsigned channels,
- GError **error_r)
+bool audio_format_init_checked(struct audio_format *af, unsigned long sample_rate,
+ enum AVSampleFormat sample_format, unsigned channels,
+ GError **error_r)
{
- if (audio_check_sample_rate(sample_rate, error_r) &&
- audio_check_sample_format(sample_format, error_r) &&
- audio_check_channel_count(channels, error_r)) {
- audio_format_init(af, sample_rate, sample_format, channels);
- assert(audio_format_valid(af));
- return true;
- } else
- return false;
+ if (audio_check_sample_rate(sample_rate, error_r) &&
+ audio_check_sample_format(sample_format, error_r) &&
+ audio_check_channel_count(channels, error_r)) {
+ audio_format_init(af, sample_rate, sample_format, channels);
+ assert(audio_format_valid(af));
+ return true;
+ } else
+ return false;
}
diff --git a/src/audio_check.h b/src/audio_check.h
index 9f71cf9c..17b8eb5b 100644
--- a/src/audio_check.h
+++ b/src/audio_check.h
@@ -25,31 +25,27 @@
#include <glib.h>
#include <stdbool.h>
+#include <libavutil/samplefmt.h>
+
/**
* The GLib quark used for errors reported by this library.
*/
-G_GNUC_CONST
-static inline GQuark
-audio_format_quark(void)
+static inline GQuark audio_format_quark(void)
{
- return g_quark_from_static_string("audio_format");
+ return g_quark_from_static_string("audio_format");
}
-bool
-audio_check_sample_rate(unsigned long sample_rate, GError **error_r);
+bool audio_check_sample_rate(unsigned long sample_rate, GError **error_r);
-bool
-audio_check_sample_format(enum sample_format, GError **error_r);
+bool audio_check_sample_format(enum AVSampleFormat, GError **error_r);
-bool
-audio_check_channel_count(unsigned sample_format, GError **error_r);
+bool audio_check_channel_count(unsigned sample_format, GError **error_r);
/**
* Wrapper for audio_format_init(), which checks all attributes.
*/
-bool
-audio_format_init_checked(struct audio_format *af, unsigned long sample_rate,
- enum sample_format sample_format, unsigned channels,
- GError **error_r);
+bool audio_format_init_checked(struct audio_format *af, unsigned long sample_rate,
+ enum AVSampleFormat sample_format, unsigned channels,
+ GError **error_r);
#endif
diff --git a/src/audio_format.c b/src/audio_format.c
index 1ac29d1c..f10370fc 100644
--- a/src/audio_format.c
+++ b/src/audio_format.c
@@ -34,7 +34,7 @@ audio_format_mask_apply(struct audio_format *af,
if (mask->sample_rate != 0)
af->sample_rate = mask->sample_rate;
- if (mask->format != SAMPLE_FORMAT_UNDEFINED)
+ if (mask->format != AV_SAMPLE_FMT_NONE)
af->format = mask->format;
if (mask->channels != 0)
@@ -43,32 +43,20 @@ audio_format_mask_apply(struct audio_format *af,
assert(audio_format_valid(af));
}
-const char *
-sample_format_to_string(enum sample_format format)
+const char * sample_format_to_string(enum AVSampleFormat format)
{
switch (format) {
- case SAMPLE_FORMAT_UNDEFINED:
- return "?";
-
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
return "8";
-
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
return "16";
-
- case SAMPLE_FORMAT_S24_P32:
- return "24";
-
- case SAMPLE_FORMAT_S32:
+ case AV_SAMPLE_FMT_S32:
return "32";
-
- case SAMPLE_FORMAT_FLOAT:
+ case AV_SAMPLE_FMT_FLT:
return "f";
+ default:
+ return "?";
}
-
- /* unreachable */
- assert(false);
- return "?";
}
const char *
@@ -79,20 +67,8 @@ audio_format_to_string(const struct audio_format *af,
assert(s != NULL);
snprintf(s->buffer, sizeof(s->buffer), "%u:%s:%u",
- af->sample_rate, sample_format_to_string(af->format),
+ af->sample_rate, av_get_sample_fmt_name(af->format),
af->channels);
return s->buffer;
}
-
-enum AVSampleFormat sample_fmt_native_to_libav(enum sample_format sample_fmt)
-{
- switch (sample_fmt) {
- case SAMPLE_FORMAT_S8: return AV_SAMPLE_FMT_U8;
- case SAMPLE_FORMAT_S16: return AV_SAMPLE_FMT_S16;
- case SAMPLE_FORMAT_S24_P32:
- case SAMPLE_FORMAT_S32: return AV_SAMPLE_FMT_S32;
- case SAMPLE_FORMAT_FLOAT: return AV_SAMPLE_FMT_FLT;
- default: return AV_SAMPLE_FMT_NONE;
- }
-}
diff --git a/src/audio_format.h b/src/audio_format.h
index bb79de39..021aa10a 100644
--- a/src/audio_format.h
+++ b/src/audio_format.h
@@ -27,27 +27,6 @@
#include <libavutil/samplefmt.h>
-enum sample_format {
- SAMPLE_FORMAT_UNDEFINED = 0,
-
- SAMPLE_FORMAT_S8,
- SAMPLE_FORMAT_S16,
-
- /**
- * Signed 24 bit integer samples, packed in 32 bit integers
- * (the most significant byte is filled with the sign bit).
- */
- SAMPLE_FORMAT_S24_P32,
-
- SAMPLE_FORMAT_S32,
-
- /**
- * 32 bit floating point samples in the host's format. The
- * range is -1.0f to +1.0f.
- */
- SAMPLE_FORMAT_FLOAT,
-};
-
static const unsigned MAX_CHANNELS = 8;
/**
@@ -65,7 +44,7 @@ struct audio_format {
* The format samples are stored in. See the #sample_format
* enum for valid values.
*/
- uint8_t format;
+ enum AVSampleFormat format;
/**
* The number of channels. Only mono (1) and stereo (2) are
@@ -88,7 +67,7 @@ struct audio_format_string {
static inline void audio_format_clear(struct audio_format *af)
{
af->sample_rate = 0;
- af->format = SAMPLE_FORMAT_UNDEFINED;
+ af->format = AV_SAMPLE_FMT_NONE;
af->channels = 0;
}
@@ -98,11 +77,11 @@ static inline void audio_format_clear(struct audio_format *af)
*/
static inline void audio_format_init(struct audio_format *af,
uint32_t sample_rate,
- enum sample_format format, uint8_t channels)
+ enum AVSampleFormat format, uint8_t channels)
{
- af->sample_rate = sample_rate;
- af->format = (uint8_t)format;
- af->channels = channels;
+ af->sample_rate = sample_rate;
+ af->format = format;
+ af->channels = channels;
}
/**
@@ -119,11 +98,10 @@ static inline bool audio_format_defined(const struct audio_format *af)
* attributes are defined. This is more complete than
* audio_format_defined(), but slower.
*/
-static inline bool
-audio_format_fully_defined(const struct audio_format *af)
+static inline bool audio_format_fully_defined(const struct audio_format *af)
{
- return af->sample_rate != 0 && af->format != SAMPLE_FORMAT_UNDEFINED &&
- af->channels != 0;
+ return af->sample_rate != 0 && af->format != AV_SAMPLE_FMT_NONE &&
+ af->channels != 0;
}
/**
@@ -133,8 +111,8 @@ audio_format_fully_defined(const struct audio_format *af)
static inline bool
audio_format_mask_defined(const struct audio_format *af)
{
- return af->sample_rate != 0 || af->format != SAMPLE_FORMAT_UNDEFINED ||
- af->channels != 0;
+ return af->sample_rate != 0 || af->format != AV_SAMPLE_FMT_NONE ||
+ af->channels != 0;
}
/**
@@ -153,22 +131,9 @@ audio_valid_sample_rate(unsigned sample_rate)
*
* @param bits the number of significant bits per sample
*/
-static inline bool
-audio_valid_sample_format(enum sample_format format)
+static inline bool audio_valid_sample_format(enum AVSampleFormat format)
{
- switch (format) {
- case SAMPLE_FORMAT_S8:
- case SAMPLE_FORMAT_S16:
- case SAMPLE_FORMAT_S24_P32:
- case SAMPLE_FORMAT_S32:
- case SAMPLE_FORMAT_FLOAT:
- return true;
-
- case SAMPLE_FORMAT_UNDEFINED:
- break;
- }
-
- return false;
+ return format != AV_SAMPLE_FMT_NONE;
}
/**
@@ -184,26 +149,24 @@ audio_valid_channel_count(unsigned channels)
* Returns false if the format is not valid for playback with MPD.
* This function performs some basic validity checks.
*/
-G_GNUC_PURE
static inline bool audio_format_valid(const struct audio_format *af)
{
- return audio_valid_sample_rate(af->sample_rate) &&
- audio_valid_sample_format((enum sample_format)af->format) &&
- audio_valid_channel_count(af->channels);
+ return audio_valid_sample_rate(af->sample_rate) &&
+ audio_valid_sample_format(af->format) &&
+ audio_valid_channel_count(af->channels);
}
/**
* Returns false if the format mask is not valid for playback with
* MPD. This function performs some basic validity checks.
*/
-G_GNUC_PURE
static inline bool audio_format_mask_valid(const struct audio_format *af)
{
- return (af->sample_rate == 0 ||
- audio_valid_sample_rate(af->sample_rate)) &&
- (af->format == SAMPLE_FORMAT_UNDEFINED ||
- audio_valid_sample_format((enum sample_format)af->format)) &&
- (af->channels == 0 || audio_valid_channel_count(af->channels));
+ return (af->sample_rate == 0 ||
+ audio_valid_sample_rate(af->sample_rate)) &&
+ (af->format == AV_SAMPLE_FMT_NONE ||
+ audio_valid_sample_format(af->format)) &&
+ (af->channels == 0 || audio_valid_channel_count(af->channels));
}
static inline bool audio_format_equals(const struct audio_format *a,
@@ -214,58 +177,21 @@ static inline bool audio_format_equals(const struct audio_format *a,
a->channels == b->channels;
}
-void
-audio_format_mask_apply(struct audio_format *af,
- const struct audio_format *mask);
-
-G_GNUC_CONST
-static inline unsigned
-sample_format_size(enum sample_format format)
-{
- switch (format) {
- case SAMPLE_FORMAT_S8:
- return 1;
-
- case SAMPLE_FORMAT_S16:
- return 2;
-
- case SAMPLE_FORMAT_S24_P32:
- case SAMPLE_FORMAT_S32:
- case SAMPLE_FORMAT_FLOAT:
- return 4;
-
- case SAMPLE_FORMAT_UNDEFINED:
- return 0;
- }
-
- assert(false);
- return 0;
-}
-
-/**
- * Returns the size of each (mono) sample in bytes.
- */
-G_GNUC_PURE
-static inline unsigned audio_format_sample_size(const struct audio_format *af)
-{
- return sample_format_size((enum sample_format)af->format);
-}
+void audio_format_mask_apply(struct audio_format *af,
+ const struct audio_format *mask);
/**
* Returns the size of each full frame in bytes.
*/
-G_GNUC_PURE
-static inline unsigned
-audio_format_frame_size(const struct audio_format *af)
+static inline unsigned audio_format_frame_size(const struct audio_format *af)
{
- return audio_format_sample_size(af) * af->channels;
+ return av_get_bytes_per_sample(af->format) * af->channels;
}
/**
* Returns the floating point factor which converts a time span to a
* storage size in bytes.
*/
-G_GNUC_PURE
static inline double audio_format_time_to_size(const struct audio_format *af)
{
return af->sample_rate * audio_format_frame_size(af);
@@ -278,9 +204,7 @@ static inline double audio_format_time_to_size(const struct audio_format *af)
* @param format a #sample_format enum value
* @return the string
*/
-G_GNUC_PURE G_GNUC_MALLOC
-const char *
-sample_format_to_string(enum sample_format format);
+const char *sample_format_to_string(enum AVSampleFormat format);
/**
* Renders the #audio_format object into a string, e.g. for printing
@@ -290,11 +214,7 @@ sample_format_to_string(enum sample_format format);
* @param s a buffer to print into
* @return the string, or NULL if the #audio_format object is invalid
*/
-G_GNUC_PURE G_GNUC_MALLOC
-const char *
-audio_format_to_string(const struct audio_format *af,
- struct audio_format_string *s);
-
-enum AVSampleFormat sample_fmt_native_to_libav(enum sample_format);
+const char *audio_format_to_string(const struct audio_format *af,
+ struct audio_format_string *s);
#endif
diff --git a/src/audio_parser.c b/src/audio_parser.c
index c37effff..99a448cd 100644
--- a/src/audio_parser.c
+++ b/src/audio_parser.c
@@ -32,6 +32,8 @@
#include <string.h>
#include <stdlib.h>
+#include <libavutil/samplefmt.h>
+
/**
* The GLib quark used for errors reported by this library.
*/
@@ -67,23 +69,22 @@ parse_sample_rate(const char *src, bool mask, uint32_t *sample_rate_r,
return true;
}
-static bool
-parse_sample_format(const char *src, bool mask,
- enum sample_format *sample_format_r,
- const char **endptr_r, GError **error_r)
+static bool parse_sample_format(const char *src, bool mask,
+ enum AVSampleFormat *sample_format_r,
+ const char **endptr_r, GError **error_r)
{
unsigned long value;
char *endptr;
- enum sample_format sample_format;
+ enum AVSampleFormat sample_format;
if (mask && *src == '*') {
- *sample_format_r = SAMPLE_FORMAT_UNDEFINED;
+ *sample_format_r = AV_SAMPLE_FMT_NONE;
*endptr_r = src + 1;
return true;
}
if (*src == 'f') {
- *sample_format_r = SAMPLE_FORMAT_FLOAT;
+ *sample_format_r = AV_SAMPLE_FMT_FLT;
*endptr_r = src + 1;
return true;
}
@@ -97,23 +98,15 @@ parse_sample_format(const char *src, bool mask,
switch (value) {
case 8:
- sample_format = SAMPLE_FORMAT_S8;
+ sample_format = AV_SAMPLE_FMT_U8;
break;
case 16:
- sample_format = SAMPLE_FORMAT_S16;
- break;
-
- case 24:
- if (memcmp(endptr, "_3", 2) == 0)
- /* for backwards compatibility */
- endptr += 2;
-
- sample_format = SAMPLE_FORMAT_S24_P32;
+ sample_format = AV_SAMPLE_FMT_S16;
break;
case 32:
- sample_format = SAMPLE_FORMAT_S32;
+ sample_format = AV_SAMPLE_FMT_S32;
break;
default:
@@ -160,18 +153,12 @@ audio_format_parse(struct audio_format *dest, const char *src,
bool mask, GError **error_r)
{
uint32_t rate;
- enum sample_format sample_format;
+ enum AVSampleFormat sample_format;
uint8_t channels;
audio_format_clear(dest);
/* parse sample rate */
-
-#if GCC_CHECK_VERSION(4,7)
- /* workaround -Wmaybe-uninitialized false positive */
- rate = 0;
-#endif
-
if (!parse_sample_rate(src, mask, &rate, &src, error_r))
return false;
@@ -182,12 +169,6 @@ audio_format_parse(struct audio_format *dest, const char *src,
}
/* parse sample format */
-
-#if GCC_CHECK_VERSION(4,7)
- /* workaround -Wmaybe-uninitialized false positive */
- sample_format = SAMPLE_FORMAT_UNDEFINED;
-#endif
-
if (!parse_sample_format(src, mask, &sample_format, &src, error_r))
return false;
diff --git a/src/chunk.c b/src/chunk.c
index a7f11c3f..b9dc6c80 100644
--- a/src/chunk.c
+++ b/src/chunk.c
@@ -24,6 +24,7 @@
#include <libavutil/frame.h>
#include <libavutil/mem.h>
+#include <libavutil/samplefmt.h>
#include <assert.h>
@@ -34,6 +35,9 @@ music_chunk_init(struct music_chunk *chunk)
chunk->frame = NULL;
chunk->tag = NULL;
chunk->replay_gain_serial = 0;
+#ifndef NDEBUG
+ chunk->audio_format.format = AV_SAMPLE_FMT_NONE;
+#endif
}
struct music_chunk *music_chunk_alloc(void)
diff --git a/src/decoder/libav_decoder_plugin.c b/src/decoder/libav_decoder_plugin.c
index 05b9b2fb..a1e05b6b 100644
--- a/src/decoder/libav_decoder_plugin.c
+++ b/src/decoder/libav_decoder_plugin.c
@@ -42,6 +42,7 @@
#include <libavutil/mathematics.h>
#include <libavutil/dict.h>
#include <libavutil/opt.h>
+#include <libavutil/samplefmt.h>
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "libav"
@@ -203,15 +204,6 @@ static enum decoder_command libav_send_packet(struct decoder *decoder,
return cmd;
}
-static enum sample_format libav_sample_format(const AVCodecContext *codec_context)
-{
- switch (codec_context->sample_fmt) {
- case AV_SAMPLE_FMT_S16: return SAMPLE_FORMAT_S16;
- case AV_SAMPLE_FMT_S32: return SAMPLE_FORMAT_S32;
- default: return SAMPLE_FORMAT_UNDEFINED;
- }
-}
-
static void libav_decode(struct decoder *decoder, struct input_stream *input)
{
LibavDecContext s = { .decoder = decoder };
@@ -236,7 +228,7 @@ static void libav_decode(struct decoder *decoder, struct input_stream *input)
if (!audio_format_init_checked(&audio_format,
dec->sample_rate,
- libav_sample_format(dec),
+ dec->sample_fmt,
dec->channels, &error)) {
g_warning("%s", error->message);
g_error_free(error);
diff --git a/src/decoder_api.c b/src/decoder_api.c
index 939e4470..662b9d8e 100644
--- a/src/decoder_api.c
+++ b/src/decoder_api.c
@@ -398,6 +398,9 @@ enum decoder_command decoder_data(struct decoder *decoder,
chunk->frame = frame;
chunk->bit_rate = kbit_rate;
chunk->times = decoder->timestamp - dc->song->start_ms / 1000.0;
+#ifndef NDEBUG
+ chunk->audio_format = dc->out_audio_format;
+#endif
frame = NULL;
diff --git a/src/decoder_internal.c b/src/decoder_internal.c
index 5078591b..cd8f03c1 100644
--- a/src/decoder_internal.c
+++ b/src/decoder_internal.c
@@ -56,7 +56,7 @@ struct music_chunk *decoder_get_chunk(struct decoder *decoder)
assert(decoder != NULL);
do {
- if (music_pipe_size(dc->pipe) >= dc->buffer_samples) {
+ if (music_pipe_size(dc->pipe) <= dc->buffer_samples) {
chunk = music_chunk_alloc();
if (!chunk)
return NULL;
diff --git a/src/encoder/flac_encoder.c b/src/encoder/flac_encoder.c
index e32588e2..d5b9ae26 100644
--- a/src/encoder/flac_encoder.c
+++ b/src/encoder/flac_encoder.c
@@ -173,21 +173,17 @@ flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format,
/* FIXME: flac should support 32bit as well */
switch (audio_format->format) {
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
bits_per_sample = 8;
break;
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
bits_per_sample = 16;
break;
- case SAMPLE_FORMAT_S24_P32:
- bits_per_sample = 24;
- break;
-
default:
- bits_per_sample = 24;
- audio_format->format = SAMPLE_FORMAT_S24_P32;
+ bits_per_sample = 16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
}
/* allocate the encoder */
@@ -291,24 +287,17 @@ flac_encoder_write(struct encoder *_encoder,
num_samples = num_frames * encoder->audio_format.channels;
switch (encoder->audio_format.format) {
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
exbuffer = pcm_buffer_get(&encoder->expand_buffer, length*4);
pcm8_to_flac(exbuffer, data, num_samples);
buffer = exbuffer;
break;
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
exbuffer = pcm_buffer_get(&encoder->expand_buffer, length*2);
pcm16_to_flac(exbuffer, data, num_samples);
buffer = exbuffer;
break;
-
- case SAMPLE_FORMAT_S24_P32:
- case SAMPLE_FORMAT_S32:
- /* nothing need to be done; format is the same for
- both mpd and libFLAC */
- buffer = data;
- break;
}
/* feed samples to encoder */
diff --git a/src/encoder/lame_encoder.c b/src/encoder/lame_encoder.c
index 3bb99ea2..e7c3b5a7 100644
--- a/src/encoder/lame_encoder.c
+++ b/src/encoder/lame_encoder.c
@@ -26,6 +26,8 @@
#include <assert.h>
#include <string.h>
+#include <libavutil/samplefmt.h>
+
struct lame_encoder {
struct encoder encoder;
@@ -192,7 +194,7 @@ lame_encoder_open(struct encoder *_encoder, struct audio_format *audio_format,
{
struct lame_encoder *encoder = (struct lame_encoder *)_encoder;
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
audio_format->channels = 2;
encoder->audio_format = *audio_format;
diff --git a/src/encoder/twolame_encoder.c b/src/encoder/twolame_encoder.c
index 934b2ab2..cdbe1f1b 100644
--- a/src/encoder/twolame_encoder.c
+++ b/src/encoder/twolame_encoder.c
@@ -26,6 +26,8 @@
#include <assert.h>
#include <string.h>
+#include <libavutil/samplefmt.h>
+
struct twolame_encoder {
struct encoder encoder;
@@ -192,7 +194,7 @@ twolame_encoder_open(struct encoder *_encoder, struct audio_format *audio_format
{
struct twolame_encoder *encoder = (struct twolame_encoder *)_encoder;
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
audio_format->channels = 2;
encoder->audio_format = *audio_format;
diff --git a/src/encoder/vorbis_encoder.c b/src/encoder/vorbis_encoder.c
index fcf2b513..728d1f76 100644
--- a/src/encoder/vorbis_encoder.c
+++ b/src/encoder/vorbis_encoder.c
@@ -28,6 +28,8 @@
#include <assert.h>
+#include <libavutil/samplefmt.h>
+
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "vorbis_encoder"
@@ -213,7 +215,7 @@ vorbis_encoder_open(struct encoder *_encoder,
struct vorbis_encoder *encoder = (struct vorbis_encoder *)_encoder;
bool ret;
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
encoder->audio_format = *audio_format;
diff --git a/src/encoder/wave_encoder.c b/src/encoder/wave_encoder.c
index 9eeb4d51..fe087659 100644
--- a/src/encoder/wave_encoder.c
+++ b/src/encoder/wave_encoder.c
@@ -26,6 +26,8 @@
#include <assert.h>
#include <string.h>
+#include <libavutil/samplefmt.h>
+
struct wave_encoder {
struct encoder encoder;
unsigned bits;
@@ -114,24 +116,17 @@ wave_encoder_open(struct encoder *_encoder,
assert(audio_format_valid(audio_format));
switch (audio_format->format) {
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
encoder->bits = 8;
break;
-
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
encoder->bits = 16;
break;
-
- case SAMPLE_FORMAT_S24_P32:
- encoder->bits = 24;
- break;
-
- case SAMPLE_FORMAT_S32:
+ case AV_SAMPLE_FMT_S32:
encoder->bits = 32;
break;
-
default:
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
encoder->bits = 16;
break;
}
diff --git a/src/filter/normalize_filter_plugin.c b/src/filter/normalize_filter_plugin.c
index b17a8773..eb44bbb3 100644
--- a/src/filter/normalize_filter_plugin.c
+++ b/src/filter/normalize_filter_plugin.c
@@ -66,7 +66,7 @@ normalize_filter_open(struct filter *_filter,
{
struct normalize_filter *filter = (struct normalize_filter *)_filter;
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
filter->compressor = Compressor_new(0);
diff --git a/src/filter_plugin.c b/src/filter_plugin.c
index 61b340c7..aa7479fa 100644
--- a/src/filter_plugin.c
+++ b/src/filter_plugin.c
@@ -84,7 +84,10 @@ filter_open(struct filter *filter, struct audio_format *audio_format,
assert(audio_format_valid(audio_format));
assert(error_r == NULL || *error_r == NULL);
- out_audio_format = filter->plugin->open(filter, audio_format, error_r);
+ if (filter->plugin->open)
+ out_audio_format = filter->plugin->open(filter, audio_format, error_r);
+ else
+ out_audio_format = audio_format;
assert(out_audio_format == NULL || audio_format_valid(audio_format));
assert(out_audio_format == NULL ||
@@ -98,7 +101,8 @@ filter_close(struct filter *filter)
{
assert(filter != NULL);
- filter->plugin->close(filter);
+ if (filter->plugin->close)
+ filter->plugin->close(filter);
}
AVFrame *filter_filter(struct filter *filter, AVFrame *src)
diff --git a/src/output/alsa_output_plugin.c b/src/output/alsa_output_plugin.c
index 4470e05e..18f65143 100644
--- a/src/output/alsa_output_plugin.c
+++ b/src/output/alsa_output_plugin.c
@@ -24,6 +24,9 @@
#include "pcm_export.h"
#include <glib.h>
+
+#include <libavutil/samplefmt.h>
+
#include <alsa/asoundlib.h>
#undef G_LOG_DOMAIN
@@ -211,27 +214,20 @@ alsa_test_default_device(void)
return true;
}
-static snd_pcm_format_t
-get_bitformat(enum sample_format sample_format)
+static snd_pcm_format_t get_bitformat(enum AVSampleFormat sample_format)
{
switch (sample_format) {
- case SAMPLE_FORMAT_UNDEFINED:
- return SND_PCM_FORMAT_UNKNOWN;
-
- case SAMPLE_FORMAT_S8:
- return SND_PCM_FORMAT_S8;
-
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_U8:
+ return SND_PCM_FORMAT_U8;
+ case AV_SAMPLE_FMT_S16:
return SND_PCM_FORMAT_S16;
-
- case SAMPLE_FORMAT_S24_P32:
- return SND_PCM_FORMAT_S24;
-
- case SAMPLE_FORMAT_S32:
+ case AV_SAMPLE_FMT_S32:
return SND_PCM_FORMAT_S32;
-
- case SAMPLE_FORMAT_FLOAT:
+ case AV_SAMPLE_FMT_FLT:
return SND_PCM_FORMAT_FLOAT;
+ default:
+ return SND_PCM_FORMAT_UNKNOWN;
+
}
assert(false);
@@ -300,10 +296,9 @@ alsa_try_format_or_packed(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
* Attempts to configure the specified sample format, and tries the
* reversed host byte order if was not supported.
*/
-static int
-alsa_output_try_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
- enum sample_format sample_format,
- bool *packed_r, bool *reverse_endian_r)
+static int alsa_output_try_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
+ enum AVSampleFormat sample_format,
+ bool *packed_r, bool *reverse_endian_r)
{
snd_pcm_format_t alsa_format = get_bitformat(sample_format);
if (alsa_format == SND_PCM_FORMAT_UNKNOWN)
@@ -343,18 +338,17 @@ alsa_output_setup_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *hwparams,
/* if unsupported by the hardware, try other formats */
- static const enum sample_format probe_formats[] = {
- SAMPLE_FORMAT_S24_P32,
- SAMPLE_FORMAT_S32,
- SAMPLE_FORMAT_S16,
- SAMPLE_FORMAT_S8,
- SAMPLE_FORMAT_UNDEFINED,
+ static const enum AVSampleFormat probe_formats[] = {
+ AV_SAMPLE_FMT_S32,
+ AV_SAMPLE_FMT_S16,
+ AV_SAMPLE_FMT_U8,
+ AV_SAMPLE_FMT_NONE,
};
for (unsigned i = 0;
- err == -EINVAL && probe_formats[i] != SAMPLE_FORMAT_UNDEFINED;
+ err == -EINVAL && probe_formats[i] != AV_SAMPLE_FMT_NONE;
++i) {
- const enum sample_format mpd_format = probe_formats[i];
+ const enum AVSampleFormat mpd_format = probe_formats[i];
if (mpd_format == audio_format->format)
continue;
@@ -578,13 +572,13 @@ static bool
alsa_setup_or_dsd(struct alsa_data *ad, struct audio_format *audio_format,
GError **error_r)
{
- bool shift8 = false, packed, reverse_endian;
+ bool packed, reverse_endian;
const bool success = alsa_setup(ad, audio_format, &packed, &reverse_endian, error_r);
if (!success)
return false;
- pcm_export_open(&ad->export, audio_format->format, shift8, packed, reverse_endian);
+ pcm_export_open(&ad->export, audio_format->format, packed, reverse_endian);
return true;
}
diff --git a/src/output/ao_output_plugin.c b/src/output/ao_output_plugin.c
index d7e577fa..6f28ab3d 100644
--- a/src/output/ao_output_plugin.c
+++ b/src/output/ao_output_plugin.c
@@ -24,6 +24,8 @@
#include <ao/ao.h>
#include <glib.h>
+#include <libavutil/samplefmt.h>
+
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "ao"
@@ -189,11 +191,11 @@ ao_output_open(struct audio_output *ao, struct audio_format *audio_format,
struct ao_data *ad = (struct ao_data *)ao;
switch (audio_format->format) {
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
format.bits = 8;
break;
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
format.bits = 16;
break;
@@ -201,7 +203,7 @@ ao_output_open(struct audio_output *ao, struct audio_format *audio_format,
/* support for 24 bit samples in libao is currently
dubious, and until we have sorted that out,
convert everything to 16 bit */
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
format.bits = 16;
break;
}
diff --git a/src/output/ffado_output_plugin.c b/src/output/ffado_output_plugin.c
index ba239a4a..58c367ca 100644
--- a/src/output/ffado_output_plugin.c
+++ b/src/output/ffado_output_plugin.c
@@ -35,6 +35,9 @@
#include "timer.h"
#include <glib.h>
+
+#include <libavutil/samplefmt.h>
+
#include <assert.h>
#include <libffado/ffado.h>
@@ -244,7 +247,7 @@ ffado_open(struct audio_output *ao, struct audio_format *audio_format,
/* will be converted to floating point, choose best input
format */
- audio_format->format = SAMPLE_FORMAT_S24_P32;
+ audio_format->format = AV_SAMPLE_FMT_S16;
ffado_device_info_t device_info;
memset(&device_info, 0, sizeof(device_info));
diff --git a/src/output/jack_output_plugin.c b/src/output/jack_output_plugin.c
index a24cb855..81a2ca3d 100644
--- a/src/output/jack_output_plugin.c
+++ b/src/output/jack_output_plugin.c
@@ -24,6 +24,9 @@
#include <assert.h>
#include <glib.h>
+
+#include <libavutil/samplefmt.h>
+
#include <jack/jack.h>
#include <jack/types.h>
#include <jack/ringbuffer.h>
@@ -197,9 +200,7 @@ set_audioformat(struct jack_data *jd, struct audio_format *audio_format)
else if (audio_format->channels > jd->num_source_ports)
audio_format->channels = 2;
- if (audio_format->format != SAMPLE_FORMAT_S16 &&
- audio_format->format != SAMPLE_FORMAT_S24_P32)
- audio_format->format = SAMPLE_FORMAT_S24_P32;
+ audio_format->format = AV_SAMPLE_FMT_S16;
}
static void
@@ -657,16 +658,10 @@ mpd_jack_write_samples(struct jack_data *jd, const void *src,
unsigned num_samples)
{
switch (jd->audio_format.format) {
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
mpd_jack_write_samples_16(jd, (const int16_t*)src,
num_samples);
break;
-
- case SAMPLE_FORMAT_S24_P32:
- mpd_jack_write_samples_24(jd, (const int32_t*)src,
- num_samples);
- break;
-
default:
assert(false);
}
diff --git a/src/output/mvp_output_plugin.c b/src/output/mvp_output_plugin.c
index 37e0f7c9..783c072d 100644
--- a/src/output/mvp_output_plugin.c
+++ b/src/output/mvp_output_plugin.c
@@ -29,6 +29,8 @@
#include <glib.h>
+#include <libavutil/samplefmt.h>
+
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
@@ -181,18 +183,14 @@ mvp_set_pcm_params(struct mvp_data *md, struct audio_format *audio_format,
/* 0,1=24bit(24) , 2,3=16bit */
switch (audio_format->format) {
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
mix[1] = 2;
break;
- case SAMPLE_FORMAT_S24_P32:
- mix[1] = 0;
- break;
-
default:
g_debug("unsupported sample format %s - falling back to 16 bit",
sample_format_to_string(audio_format->format));
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
mix[1] = 2;
break;
}
diff --git a/src/output/openal_output_plugin.c b/src/output/openal_output_plugin.c
index ebd35ef1..dac9e54e 100644
--- a/src/output/openal_output_plugin.c
+++ b/src/output/openal_output_plugin.c
@@ -23,6 +23,8 @@
#include <glib.h>
+#include <libavutil/samplefmt.h>
+
#ifndef HAVE_OSX
#include <AL/al.h>
#include <AL/alc.h>
@@ -56,15 +58,10 @@ openal_output_quark(void)
return g_quark_from_static_string("openal_output");
}
-static ALenum
-openal_audio_format(struct audio_format *audio_format)
+static ALenum openal_audio_format(struct audio_format *audio_format)
{
- /* note: cannot map SAMPLE_FORMAT_S8 to AL_FORMAT_STEREO8 or
- AL_FORMAT_MONO8 since OpenAL expects unsigned 8 bit
- samples, while MPD uses signed samples */
-
switch (audio_format->format) {
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
if (audio_format->channels == 2)
return AL_FORMAT_STEREO16;
if (audio_format->channels == 1)
@@ -76,7 +73,7 @@ openal_audio_format(struct audio_format *audio_format)
default:
/* fall back to 16 bit */
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
return openal_audio_format(audio_format);
}
}
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 */
diff --git a/src/output/osx_output_plugin.c b/src/output/osx_output_plugin.c
index fbba8174..11851186 100644
--- a/src/output/osx_output_plugin.c
+++ b/src/output/osx_output_plugin.c
@@ -23,6 +23,9 @@
#include "fifo_buffer.h"
#include <glib.h>
+
+#include <libavutil/samplefmt.h>
+
#include <CoreAudio/AudioHardware.h>
#include <AudioUnit/AudioUnit.h>
#include <CoreServices/CoreServices.h>
@@ -326,20 +329,17 @@ osx_output_open(struct audio_output *ao, struct audio_format *audio_format, GErr
stream_description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
switch (audio_format->format) {
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
stream_description.mBitsPerChannel = 8;
break;
-
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
stream_description.mBitsPerChannel = 16;
break;
-
- case SAMPLE_FORMAT_S32:
+ case AV_SAMPLE_FMT_S32:
stream_description.mBitsPerChannel = 32;
break;
-
default:
- audio_format->format = SAMPLE_FORMAT_S32;
+ audio_format->format = AV_SAMPLE_FMT_S32;
stream_description.mBitsPerChannel = 32;
break;
}
diff --git a/src/output/pulse_output_plugin.c b/src/output/pulse_output_plugin.c
index 0dc9be0e..5f8ef1d5 100644
--- a/src/output/pulse_output_plugin.c
+++ b/src/output/pulse_output_plugin.c
@@ -25,6 +25,8 @@
#include <glib.h>
+#include <libavutil/samplefmt.h>
+
#include <pulse/thread-mainloop.h>
#include <pulse/context.h>
#include <pulse/stream.h>
@@ -616,7 +618,7 @@ pulse_output_open(struct audio_output *ao, struct audio_format *audio_format,
/* MPD doesn't support the other pulseaudio sample formats, so
we just force MPD to send us everything as 16 bit */
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
ss.format = PA_SAMPLE_S16NE;
ss.rate = audio_format->sample_rate;
diff --git a/src/output/roar_output_plugin.c b/src/output/roar_output_plugin.c
index 1c2c4832..90dc2ac0 100644
--- a/src/output/roar_output_plugin.c
+++ b/src/output/roar_output_plugin.c
@@ -154,27 +154,20 @@ roar_use_audio_format(struct roar_audio_info *info,
info->codec = ROAR_CODEC_PCM_S;
switch (audio_format->format) {
- case SAMPLE_FORMAT_UNDEFINED:
- info->bits = 16;
- audio_format->format = SAMPLE_FORMAT_S16;
- break;
-
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
info->bits = 8;
break;
-
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
info->bits = 16;
break;
-
- case SAMPLE_FORMAT_S24_P32:
+ case AV_SAMPLE_FMT_S32:
info->bits = 32;
- audio_format->format = SAMPLE_FORMAT_S32;
break;
-
- case SAMPLE_FORMAT_S32:
- info->bits = 32;
+ default:
+ info->bits = 16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
break;
+
}
}
diff --git a/src/output/solaris_output_plugin.c b/src/output/solaris_output_plugin.c
index ce726009..2c3cc677 100644
--- a/src/output/solaris_output_plugin.c
+++ b/src/output/solaris_output_plugin.c
@@ -24,6 +24,8 @@
#include <glib.h>
+#include <libavutil/samplefmt.h>
+
#include <sys/stropts.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -114,7 +116,7 @@ solaris_output_open(struct audio_output *ao, struct audio_format *audio_format,
/* support only 16 bit mono/stereo for now; nothing else has
been tested */
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
/* open the device in non-blocking mode */
diff --git a/src/output/winmm_output_plugin.c b/src/output/winmm_output_plugin.c
index 4d95834b..f2c9cb6a 100644
--- a/src/output/winmm_output_plugin.c
+++ b/src/output/winmm_output_plugin.c
@@ -28,6 +28,8 @@
#include <string.h>
#include <windows.h>
+#include <libavutil/samplefmt.h>
+
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "winmm_output"
@@ -157,15 +159,12 @@ winmm_output_open(struct audio_output *ao, struct audio_format *audio_format,
}
switch (audio_format->format) {
- case SAMPLE_FORMAT_S8:
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_U8:
+ case AV_SAMPLE_FMT_S16:
break;
-
- case SAMPLE_FORMAT_S24_P32:
- case SAMPLE_FORMAT_S32:
- case SAMPLE_FORMAT_UNDEFINED:
+ default:
/* we havn't tested formats other than S16 */
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = AV_SAMPLE_FMT_S16;
break;
}
@@ -179,7 +178,7 @@ winmm_output_open(struct audio_output *ao, struct audio_format *audio_format,
format.nSamplesPerSec = audio_format->sample_rate;
format.nBlockAlign = audio_format_frame_size(audio_format);
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
- format.wBitsPerSample = audio_format_sample_size(audio_format) * 8;
+ format.wBitsPerSample = av_get_bytes_per_sample(audio_format->format) * 8;
format.cbSize = 0;
MMRESULT result = waveOutOpen(&wo->handle, wo->device_id, &format,
diff --git a/src/pcm_convert.c b/src/pcm_convert.c
index 67f8d5e7..267e32c8 100644
--- a/src/pcm_convert.c
+++ b/src/pcm_convert.c
@@ -64,7 +64,7 @@ AVFrame *pcm_convert(struct pcm_convert_state *state,
state->dst_channel_layout = av_get_default_channel_layout(dest_format->channels);
state->dst_samplerate = dest_format->sample_rate;
- state->dst_format = sample_fmt_native_to_libav(dest_format->format);
+ state->dst_format = dest_format->format;
av_opt_set_int(state->avr, "in_channel_layout", src->channel_layout, 0);
av_opt_set_int(state->avr, "out_channel_layout", state->dst_channel_layout, 0);
diff --git a/src/pcm_export.c b/src/pcm_export.c
index b430318e..b6773d4c 100644
--- a/src/pcm_export.c
+++ b/src/pcm_export.c
@@ -22,6 +22,8 @@
#include "pcm_pack.h"
#include "util/byte_reverse.h"
+#include <libavutil/samplefmt.h>
+
void
pcm_export_init(struct pcm_export_state *state)
{
@@ -35,23 +37,15 @@ void pcm_export_deinit(struct pcm_export_state *state)
pcm_buffer_deinit(&state->pack_buffer);
}
-void
-pcm_export_open(struct pcm_export_state *state,
- enum sample_format sample_format,
- bool shift8, bool pack, bool reverse_endian)
+void pcm_export_open(struct pcm_export_state *state,
+ enum AVSampleFormat sample_format,
+ bool pack, bool reverse_endian)
{
assert(audio_valid_sample_format(sample_format));
- state->shift8 = shift8 && sample_format == SAMPLE_FORMAT_S24_P32;
- state->pack24 = pack && sample_format == SAMPLE_FORMAT_S24_P32;
-
- assert(!state->shift8 || !state->pack24);
-
state->reverse_endian = 0;
if (reverse_endian) {
- size_t sample_size = state->pack24
- ? 3
- : sample_format_size(sample_format);
+ size_t sample_size = av_get_bytes_per_sample(sample_format);
assert(sample_size <= 0xff);
if (sample_size > 1)
@@ -66,10 +60,6 @@ pcm_export_frame_size(const struct pcm_export_state *state,
assert(state != NULL);
assert(audio_format != NULL);
- if (state->pack24)
- /* packed 24 bit samples (3 bytes per sample) */
- return audio_format->channels * 3;
-
return audio_format_frame_size(audio_format);
}
@@ -77,36 +67,6 @@ const void *
pcm_export(struct pcm_export_state *state, const void *data, size_t size,
size_t *dest_size_r)
{
- if (state->pack24) {
- assert(size % 4 == 0);
-
- const size_t num_samples = size / 4;
- const size_t dest_size = num_samples * 3;
-
- const uint8_t *src8 = data, *src_end8 = src8 + size;
- uint8_t *dest = pcm_buffer_get(&state->pack_buffer, dest_size);
- assert(dest != NULL);
-
- pcm_pack_24(dest, (const int32_t *)src8,
- (const int32_t *)src_end8);
-
- data = dest;
- size = dest_size;
- } else if (state->shift8) {
- assert(size % 4 == 0);
-
- const uint8_t *src8 = data, *src_end8 = src8 + size;
- const uint32_t *src = (const uint32_t *)src8;
- const uint32_t *const src_end = (const uint32_t *)src_end8;
-
- uint32_t *dest = pcm_buffer_get(&state->pack_buffer, size);
- data = dest;
-
- while (src < src_end)
- *dest++ = *src++ << 8;
- }
-
-
if (state->reverse_endian > 0) {
assert(state->reverse_endian >= 2);
@@ -126,9 +86,5 @@ pcm_export(struct pcm_export_state *state, const void *data, size_t size,
size_t
pcm_export_source_size(const struct pcm_export_state *state, size_t size)
{
- if (state->pack24)
- /* 32 bit to 24 bit conversion (4 to 3 bytes) */
- size = (size / 3) * 4;
-
return size;
}
diff --git a/src/pcm_export.h b/src/pcm_export.h
index 096ae8a6..941036c9 100644
--- a/src/pcm_export.h
+++ b/src/pcm_export.h
@@ -54,17 +54,6 @@ struct pcm_export_state {
uint8_t channels;
/**
- * Convert (padded) 24 bit samples to 32 bit by shifting 8
- * bits to the left?
- */
- bool shift8;
-
- /**
- * Pack 24 bit samples?
- */
- bool pack24;
-
- /**
* Export the samples in reverse byte order? A non-zero value
* means the option is enabled and represents the size of each
* sample (2 or bigger).
@@ -93,8 +82,8 @@ pcm_export_deinit(struct pcm_export_state *state);
* This function cannot fail.
*/
void pcm_export_open(struct pcm_export_state *state,
- enum sample_format sample_format,
- bool shift8, bool pack, bool reverse_endian);
+ enum AVSampleFormat sample_format,
+ bool pack, bool reverse_endian);
/**
* Calculate the size of one output frame.
diff --git a/src/pcm_mix.c b/src/pcm_mix.c
index 9f344f78..ac1fd7a0 100644
--- a/src/pcm_mix.c
+++ b/src/pcm_mix.c
@@ -112,46 +112,33 @@ pcm_add_vol_float(float *buffer1, const float *buffer2,
}
}
-static bool
-pcm_add_vol(void *buffer1, const void *buffer2, size_t size,
- int vol1, int vol2,
- enum sample_format format)
+static bool pcm_add_vol(void *buffer1, const void *buffer2, size_t size,
+ int vol1, int vol2,
+ enum AVSampleFormat format)
{
- switch (format) {
- case SAMPLE_FORMAT_UNDEFINED:
- /* not implemented */
- return false;
-
- case SAMPLE_FORMAT_S8:
- pcm_add_vol_8((int8_t *)buffer1, (const int8_t *)buffer2,
- size, vol1, vol2);
- return true;
-
- case SAMPLE_FORMAT_S16:
- pcm_add_vol_16((int16_t *)buffer1, (const int16_t *)buffer2,
- size / 2, vol1, vol2);
- return true;
-
- case SAMPLE_FORMAT_S24_P32:
- pcm_add_vol_24((int32_t *)buffer1, (const int32_t *)buffer2,
- size / 4, vol1, vol2);
- return true;
-
- case SAMPLE_FORMAT_S32:
- pcm_add_vol_32((int32_t *)buffer1, (const int32_t *)buffer2,
- size / 4, vol1, vol2);
- return true;
-
- case SAMPLE_FORMAT_FLOAT:
- pcm_add_vol_float(buffer1, buffer2, size / 4,
- pcm_volume_to_float(vol1),
- pcm_volume_to_float(vol2));
- return true;
- }
-
- /* unreachable */
- assert(false);
- return false;
+ switch (format) {
+ case AV_SAMPLE_FMT_U8:
+ pcm_add_vol_8((int8_t *)buffer1, (const int8_t *)buffer2,
+ size, vol1, vol2);
+ return true;
+ case AV_SAMPLE_FMT_S16:
+ pcm_add_vol_16((int16_t *)buffer1, (const int16_t *)buffer2,
+ size / 2, vol1, vol2);
+ return true;
+ case AV_SAMPLE_FMT_S32:
+ pcm_add_vol_32((int32_t *)buffer1, (const int32_t *)buffer2,
+ size / 4, vol1, vol2);
+ return true;
+
+ case AV_SAMPLE_FMT_FLT:
+ pcm_add_vol_float(buffer1, buffer2, size / 4,
+ pcm_volume_to_float(vol1),
+ pcm_volume_to_float(vol2));
+ return true;
+ default:
+ /* not implemented */
+ return false;
+ }
}
static void
@@ -221,44 +208,33 @@ pcm_add_float(float *buffer1, const float *buffer2, unsigned num_samples)
}
}
-static bool
-pcm_add(void *buffer1, const void *buffer2, size_t size,
- enum sample_format format)
+static bool pcm_add(void *buffer1, const void *buffer2, size_t size,
+ enum AVSampleFormat format)
{
- switch (format) {
- case SAMPLE_FORMAT_UNDEFINED:
- /* not implemented */
- return false;
-
- case SAMPLE_FORMAT_S8:
- pcm_add_8((int8_t *)buffer1, (const int8_t *)buffer2, size);
- return true;
-
- case SAMPLE_FORMAT_S16:
- pcm_add_16((int16_t *)buffer1, (const int16_t *)buffer2, size / 2);
- return true;
-
- case SAMPLE_FORMAT_S24_P32:
- pcm_add_24((int32_t *)buffer1, (const int32_t *)buffer2, size / 4);
- return true;
-
- case SAMPLE_FORMAT_S32:
- pcm_add_32((int32_t *)buffer1, (const int32_t *)buffer2, size / 4);
- return true;
-
- case SAMPLE_FORMAT_FLOAT:
- pcm_add_float(buffer1, buffer2, size / 4);
- return true;
- }
-
- /* unreachable */
- assert(false);
- return false;
+ switch (format) {
+ case AV_SAMPLE_FMT_U8:
+ pcm_add_8((int8_t *)buffer1, (const int8_t *)buffer2, size);
+ return true;
+
+ case AV_SAMPLE_FMT_S16:
+ pcm_add_16((int16_t *)buffer1, (const int16_t *)buffer2, size / 2);
+ return true;
+
+ case AV_SAMPLE_FMT_S32:
+ pcm_add_32((int32_t *)buffer1, (const int32_t *)buffer2, size / 4);
+ return true;
+
+ case AV_SAMPLE_FMT_FLT:
+ pcm_add_float(buffer1, buffer2, size / 4);
+ return true;
+ default:
+ /* not implemented */
+ return false;
+ }
}
-bool
-pcm_mix(void *buffer1, const void *buffer2, size_t size,
- enum sample_format format, float portion1)
+bool pcm_mix(void *buffer1, const void *buffer2, size_t size,
+ enum AVSampleFormat format, float portion1)
{
int vol1;
float s;
diff --git a/src/pcm_mix.h b/src/pcm_mix.h
index 0e58d01e..6be4e4e9 100644
--- a/src/pcm_mix.h
+++ b/src/pcm_mix.h
@@ -25,6 +25,8 @@
#include <stdbool.h>
#include <stddef.h>
+#include <libavutil/samplefmt.h>
+
/*
* Linearly mixes two PCM buffers. Both must have the same length and
* the same audio format. The formula is:
@@ -41,9 +43,7 @@
*
* @return true on success, false if the format is not supported
*/
-G_GNUC_WARN_UNUSED_RESULT
-bool
-pcm_mix(void *buffer1, const void *buffer2, size_t size,
- enum sample_format format, float portion1);
+bool pcm_mix(void *buffer1, const void *buffer2, size_t size,
+ enum AVSampleFormat format, float portion1);
#endif
diff --git a/src/pcm_volume.c b/src/pcm_volume.c
index d6c282c9..7b6e8635 100644
--- a/src/pcm_volume.c
+++ b/src/pcm_volume.c
@@ -27,6 +27,8 @@
#include <stdint.h>
#include <string.h>
+#include <libavutil/samplefmt.h>
+
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "pcm_volume"
@@ -142,10 +144,9 @@ pcm_volume_change_float(float *buffer, const float *end, float volume)
}
}
-bool
-pcm_volume(void *buffer, size_t length,
- enum sample_format format,
- int volume)
+bool pcm_volume(void *buffer, size_t length,
+ enum AVSampleFormat format,
+ int volume)
{
if (volume == PCM_VOLUME_1)
return true;
@@ -157,33 +158,22 @@ pcm_volume(void *buffer, size_t length,
const void *end = pcm_end_pointer(buffer, length);
switch (format) {
- case SAMPLE_FORMAT_UNDEFINED:
- /* not implemented */
- return false;
-
- case SAMPLE_FORMAT_S8:
+ case AV_SAMPLE_FMT_U8:
pcm_volume_change_8(buffer, end, volume);
return true;
-
- case SAMPLE_FORMAT_S16:
+ case AV_SAMPLE_FMT_S16:
pcm_volume_change_16(buffer, end, volume);
return true;
-
- case SAMPLE_FORMAT_S24_P32:
- pcm_volume_change_24(buffer, end, volume);
- return true;
-
- case SAMPLE_FORMAT_S32:
+ case AV_SAMPLE_FMT_S32:
pcm_volume_change_32(buffer, end, volume);
return true;
-
- case SAMPLE_FORMAT_FLOAT:
+ case AV_SAMPLE_FMT_FLT:
pcm_volume_change_float(buffer, end,
pcm_volume_to_float(volume));
return true;
- }
+ default:
+ /* not implemented */
+ return false;
- /* unreachable */
- assert(false);
- return false;
+ }
}
diff --git a/src/pcm_volume.h b/src/pcm_volume.h
index 64e3c764..58ff2fd3 100644
--- a/src/pcm_volume.h
+++ b/src/pcm_volume.h
@@ -73,9 +73,8 @@ pcm_volume_dither(void)
* @param volume the volume between 0 and #PCM_VOLUME_1
* @return true on success, false if the audio format is not supported
*/
-bool
-pcm_volume(void *buffer, size_t length,
- enum sample_format format,
- int volume);
+bool pcm_volume(void *buffer, size_t length,
+ enum AVSampleFormat format,
+ int volume);
#endif
diff --git a/src/player_thread.c b/src/player_thread.c
index 8efff1ad..5c9b7015 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -426,7 +426,7 @@ player_send_silence(struct player *player)
if (!chunk->frame)
goto fail;
frame->nb_samples = 2048;
- frame->format = sample_fmt_native_to_libav(player->play_audio_format.format);
+ frame->format = player->play_audio_format.format;
frame->sample_rate = player->play_audio_format.sample_rate;
frame->channel_layout = av_get_default_channel_layout(player->play_audio_format.channels);