Commit 128d8c7c authored by Max Kellermann's avatar Max Kellermann

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.
parent e4f5d6bd
...@@ -289,7 +289,7 @@ configure_hw: ...@@ -289,7 +289,7 @@ configure_hw:
if (err < 0) if (err < 0)
goto error; goto error;
ad->sampleSize = (audioFormat->bits / 8) * audioFormat->channels; ad->sampleSize = audio_format_sample_size(audioFormat) * audioFormat->channels;
audioOutput->open = 1; audioOutput->open = 1;
......
...@@ -268,7 +268,7 @@ static int osx_openDevice(struct audio_output *audioOutput) ...@@ -268,7 +268,7 @@ static int osx_openDevice(struct audio_output *audioOutput)
#endif #endif
streamDesc.mBytesPerPacket = streamDesc.mBytesPerPacket =
audioFormat->channels * audioFormat->bits / 8; audioFormat->channels * audio_format_sample_size(audioFormat);
streamDesc.mFramesPerPacket = 1; streamDesc.mFramesPerPacket = 1;
streamDesc.mBytesPerFrame = streamDesc.mBytesPerPacket; streamDesc.mBytesPerFrame = streamDesc.mBytesPerPacket;
streamDesc.mChannelsPerFrame = audioFormat->channels; streamDesc.mChannelsPerFrame = audioFormat->channels;
......
...@@ -141,7 +141,7 @@ static int shout_mp3_encoder_encode(struct shout_data *sd, ...@@ -141,7 +141,7 @@ static int shout_mp3_encoder_encode(struct shout_data *sd,
float (*lamebuf)[2]; float (*lamebuf)[2];
struct shout_buffer *buf = &(sd->buf); struct shout_buffer *buf = &(sd->buf);
unsigned int samples; 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; struct lame_data *ld = (struct lame_data *)sd->encoder_data;
int bytes_out; int bytes_out;
......
...@@ -257,7 +257,7 @@ static int shout_ogg_encoder_encode(struct shout_data *sd, ...@@ -257,7 +257,7 @@ static int shout_ogg_encoder_encode(struct shout_data *sd,
int j; int j;
float **vorbbuf; float **vorbbuf;
unsigned int samples; 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; struct ogg_vorbis_data *od = (struct ogg_vorbis_data *)sd->encoder_data;
samples = size / (bytes * sd->audio_format.channels); samples = size / (bytes * sd->audio_format.channels);
......
...@@ -47,14 +47,27 @@ static inline int audio_format_equals(const struct audio_format *a, ...@@ -47,14 +47,27 @@ static inline int audio_format_equals(const struct audio_format *a,
a->channels == b->channels; 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) 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) 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 #endif
...@@ -237,7 +237,8 @@ static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec, ...@@ -237,7 +237,8 @@ static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec,
FLAC__uint32 samples = frame->header.blocksize; FLAC__uint32 samples = frame->header.blocksize;
unsigned int c_samp; unsigned int c_samp;
const unsigned int num_channels = frame->header.channels; 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 = const unsigned int bytes_per_channel =
bytes_per_sample * frame->header.channels; bytes_per_sample * frame->header.channels;
const unsigned int max_samples = FLAC_CHUNK_SIZE / bytes_per_channel; const unsigned int max_samples = FLAC_CHUNK_SIZE / bytes_per_channel;
......
...@@ -160,7 +160,7 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite(mpd_unused const ...@@ -160,7 +160,7 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite(mpd_unused const
FLAC__uint16 u16; FLAC__uint16 u16;
unsigned char *uc; unsigned char *uc;
unsigned int c_samp, c_chan; unsigned int c_samp, c_chan;
int i; unsigned int i;
float timeChange; float timeChange;
timeChange = ((float)samples) / frame->header.sample_rate; timeChange = ((float)samples) / frame->header.sample_rate;
...@@ -183,7 +183,7 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite(mpd_unused const ...@@ -183,7 +183,7 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite(mpd_unused const
c_chan++) { c_chan++) {
u16 = buf[c_chan][c_samp]; u16 = buf[c_chan][c_samp];
uc = (unsigned char *)&u16; 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 (data->chunk_length >= FLAC_CHUNK_SIZE) {
if (flacSendChunk(data) < 0) { if (flacSendChunk(data) < 0) {
return return
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment