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.
This commit is contained in:
@@ -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)
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user