mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 23:06:49 +00:00
alsa: properly convert position-less channels from ALSA
The only way for ALSA to expose a position-less multi channels is to return an array full of SND_CHMAP_MONO. Converting this to a GST_AUDIO_CHANNEL_POSITION_MONO array would be invalid as GST_AUDIO_CHANNEL_POSITION_MONO is meant to be used only with one channel. Fix this by using GST_AUDIO_CHANNEL_POSITION_NONE which is meant to be used for position-less channels. https://bugzilla.gnome.org/show_bug.cgi?id=763799
This commit is contained in:
parent
7c5dfd713c
commit
6e7fa6659f
1 changed files with 16 additions and 0 deletions
|
@ -750,6 +750,7 @@ alsa_chmap_to_channel_positions (const snd_pcm_chmap_t * chmap,
|
||||||
GstAudioChannelPosition * pos)
|
GstAudioChannelPosition * pos)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
gboolean all_mono = TRUE;
|
||||||
|
|
||||||
for (c = 0; c < chmap->channels; c++) {
|
for (c = 0; c < chmap->channels; c++) {
|
||||||
if (chmap->pos[c] > SND_CHMAP_LAST)
|
if (chmap->pos[c] > SND_CHMAP_LAST)
|
||||||
|
@ -758,7 +759,22 @@ alsa_chmap_to_channel_positions (const snd_pcm_chmap_t * chmap,
|
||||||
if (!pos[c])
|
if (!pos[c])
|
||||||
return FALSE;
|
return FALSE;
|
||||||
pos[c]--;
|
pos[c]--;
|
||||||
|
|
||||||
|
if (pos[c] != GST_AUDIO_CHANNEL_POSITION_MONO)
|
||||||
|
all_mono = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (all_mono && chmap->channels > 1) {
|
||||||
|
/* GST_AUDIO_CHANNEL_POSITION_MONO can only be used with 1 channel and
|
||||||
|
* GST_AUDIO_CHANNEL_POSITION_NONE is meant to be used for position-less
|
||||||
|
* multi channels.
|
||||||
|
* Converting as ALSA can only express such configuration by using an array
|
||||||
|
* full of SND_CHMAP_MONO.
|
||||||
|
*/
|
||||||
|
for (c = 0; c < chmap->channels; c++)
|
||||||
|
pos[c] = GST_AUDIO_CHANNEL_POSITION_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue