aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-09-23 23:59:54 +0200
committerMax Kellermann <max@duempel.org>2008-09-23 23:59:54 +0200
commit128d8c7c15c0713cfccc42dfeea9b0cd9ed11d14 (patch)
tree92bb882c28b4f2621e3cccfbf1e1aa740f76a55c
parente4f5d6bdf47c96dc9c0b5fe287598bc10b168a71 (diff)
downloadmpd-128d8c7c15c0713cfccc42dfeea9b0cd9ed11d14.tar.gz
mpd-128d8c7c15c0713cfccc42dfeea9b0cd9ed11d14.tar.xz
mpd-128d8c7c15c0713cfccc42dfeea9b0cd9ed11d14.zip
audio_format: added audio_format_sample_size()
The inline function audio_format_sample_size() calculates how many bytes each sample consumes. This function already takes into account that 24 bit samples are 4 bytes long, not 3.
-rw-r--r--src/audioOutputs/audioOutput_alsa.c2
-rw-r--r--src/audioOutputs/audioOutput_osx.c2
-rw-r--r--src/audioOutputs/audioOutput_shout_mp3.c2
-rw-r--r--src/audioOutputs/audioOutput_shout_ogg.c2
-rw-r--r--src/audio_format.h17
-rw-r--r--src/inputPlugins/flac_plugin.c3
-rw-r--r--src/inputPlugins/oggflac_plugin.c4
7 files changed, 23 insertions, 9 deletions
diff --git a/src/audioOutputs/audioOutput_alsa.c b/src/audioOutputs/audioOutput_alsa.c
index 83c4f228c..995ee3a9a 100644
--- a/src/audioOutputs/audioOutput_alsa.c
+++ b/src/audioOutputs/audioOutput_alsa.c
@@ -289,7 +289,7 @@ configure_hw:
if (err < 0)
goto error;
- ad->sampleSize = (audioFormat->bits / 8) * audioFormat->channels;
+ ad->sampleSize = audio_format_sample_size(audioFormat) * audioFormat->channels;
audioOutput->open = 1;
diff --git a/src/audioOutputs/audioOutput_osx.c b/src/audioOutputs/audioOutput_osx.c
index e8a65c453..2b17666ce 100644
--- a/src/audioOutputs/audioOutput_osx.c
+++ b/src/audioOutputs/audioOutput_osx.c
@@ -268,7 +268,7 @@ static int osx_openDevice(struct audio_output *audioOutput)
#endif
streamDesc.mBytesPerPacket =
- audioFormat->channels * audioFormat->bits / 8;
+ audioFormat->channels * audio_format_sample_size(audioFormat);
streamDesc.mFramesPerPacket = 1;
streamDesc.mBytesPerFrame = streamDesc.mBytesPerPacket;
streamDesc.mChannelsPerFrame = audioFormat->channels;
diff --git a/src/audioOutputs/audioOutput_shout_mp3.c b/src/audioOutputs/audioOutput_shout_mp3.c
index 7bc3b5fba..d3ec0b75b 100644
--- a/src/audioOutputs/audioOutput_shout_mp3.c
+++ b/src/audioOutputs/audioOutput_shout_mp3.c
@@ -141,7 +141,7 @@ static int shout_mp3_encoder_encode(struct shout_data *sd,
float (*lamebuf)[2];
struct shout_buffer *buf = &(sd->buf);
unsigned int samples;
- int bytes = sd->audio_format.bits / 8;
+ int bytes = audio_format_sample_size(&sd->audio_format);
struct lame_data *ld = (struct lame_data *)sd->encoder_data;
int bytes_out;
diff --git a/src/audioOutputs/audioOutput_shout_ogg.c b/src/audioOutputs/audioOutput_shout_ogg.c
index 9605f9737..d8627a007 100644
--- a/src/audioOutputs/audioOutput_shout_ogg.c
+++ b/src/audioOutputs/audioOutput_shout_ogg.c
@@ -257,7 +257,7 @@ static int shout_ogg_encoder_encode(struct shout_data *sd,
int j;
float **vorbbuf;
unsigned int samples;
- int bytes = sd->audio_format.bits / 8;
+ int bytes = audio_format_sample_size(&sd->audio_format);
struct ogg_vorbis_data *od = (struct ogg_vorbis_data *)sd->encoder_data;
samples = size / (bytes * sd->audio_format.channels);
diff --git a/src/audio_format.h b/src/audio_format.h
index d2461a338..e45d79cd5 100644
--- a/src/audio_format.h
+++ b/src/audio_format.h
@@ -47,14 +47,27 @@ static inline int audio_format_equals(const struct audio_format *a,
a->channels == b->channels;
}
+/**
+ * Returns the size of each (mono) sample in bytes.
+ */
+static inline unsigned audio_format_sample_size(const struct audio_format *af)
+{
+ if (af->bits <= 8)
+ return 1;
+ else if (af->bits <= 16)
+ return 2;
+ else
+ return 4;
+}
+
static inline double audio_format_time_to_size(const struct audio_format *af)
{
- return af->sampleRate * af->bits * af->channels / 8.0;
+ return af->sampleRate * af->channels * audio_format_sample_size(af);
}
static inline double audioFormatSizeToTime(const struct audio_format *af)
{
- return 8.0 / af->bits / af->channels / af->sampleRate;
+ return 1.0 / audio_format_time_to_size(af);
}
#endif
diff --git a/src/inputPlugins/flac_plugin.c b/src/inputPlugins/flac_plugin.c
index 15d5c6d63..a579209e4 100644
--- a/src/inputPlugins/flac_plugin.c
+++ b/src/inputPlugins/flac_plugin.c
@@ -237,7 +237,8 @@ static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec,
FLAC__uint32 samples = frame->header.blocksize;
unsigned int c_samp;
const unsigned int num_channels = frame->header.channels;
- const unsigned int bytes_per_sample = (data->audio_format.bits / 8);
+ const unsigned int bytes_per_sample =
+ audio_format_sample_size(&data->audio_format);
const unsigned int bytes_per_channel =
bytes_per_sample * frame->header.channels;
const unsigned int max_samples = FLAC_CHUNK_SIZE / bytes_per_channel;
diff --git a/src/inputPlugins/oggflac_plugin.c b/src/inputPlugins/oggflac_plugin.c
index e0cf02524..31ddaab7f 100644
--- a/src/inputPlugins/oggflac_plugin.c
+++ b/src/inputPlugins/oggflac_plugin.c
@@ -160,7 +160,7 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite(mpd_unused const
FLAC__uint16 u16;
unsigned char *uc;
unsigned int c_samp, c_chan;
- int i;
+ unsigned int i;
float timeChange;
timeChange = ((float)samples) / frame->header.sample_rate;
@@ -183,7 +183,7 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite(mpd_unused const
c_chan++) {
u16 = buf[c_chan][c_samp];
uc = (unsigned char *)&u16;
- for (i = 0; i < (data->audio_format.bits / 8); i++) {
+ for (i = 0; i < audio_format_sample_size(&data->audio_format); i++) {
if (data->chunk_length >= FLAC_CHUNK_SIZE) {
if (flacSendChunk(data) < 0) {
return