pcm_export: add _frame_size()

Move code from the ALSA output plugin.
This commit is contained in:
Max Kellermann 2012-04-23 21:36:50 +02:00
parent a0e4b6e266
commit df1c5ce314
3 changed files with 30 additions and 3 deletions

View File

@ -674,9 +674,7 @@ alsa_open(struct audio_output *ao, struct audio_format *audio_format, GError **e
}
ad->in_frame_size = audio_format_frame_size(audio_format);
ad->out_frame_size = ad->export.pack24
? (size_t)(audio_format->channels * 3)
: ad->in_frame_size;
ad->out_frame_size = pcm_export_frame_size(&ad->export, audio_format);
return true;
}

View File

@ -70,6 +70,27 @@ pcm_export_open(struct pcm_export_state *state,
}
}
size_t
pcm_export_frame_size(const struct pcm_export_state *state,
const struct audio_format *audio_format)
{
assert(state != NULL);
assert(audio_format != NULL);
if (state->pack24)
/* packed 24 bit samples (3 bytes per sample) */
return audio_format->channels * 3;
if (state->dsd_usb)
/* the DSD-over-USB draft says that DSD 1-bit samples
are enclosed within 24 bit samples, and MPD's
representation of 24 bit is padded to 32 bit (4
bytes per sample) */
return audio_format->channels * 4;
return audio_format_frame_size(audio_format);
}
const void *
pcm_export(struct pcm_export_state *state, const void *data, size_t size,
size_t *dest_size_r)

View File

@ -114,6 +114,14 @@ pcm_export_open(struct pcm_export_state *state,
enum sample_format sample_format, unsigned channels,
bool dsd_usb, bool shift8, bool pack, bool reverse_endian);
/**
* Calculate the size of one output frame.
*/
G_GNUC_PURE
size_t
pcm_export_frame_size(const struct pcm_export_state *state,
const struct audio_format *audio_format);
/**
* Export a PCM buffer.
*