From: Anssi Hannula <anssi.hannula@iki.fi>
To: Takashi Iwai <tiwai@suse.de>
Cc: "Olivier Langlois" <olivier@trillion01.com>,
alsa-devel@alsa-project.org,
"Peter Frühberger" <fritsch@xbmc.org>
Subject: Re: [PATCH 1/3] speaker-test: Fix chmapped channel selection without specified chmap
Date: Mon, 11 Nov 2013 22:23:48 +0200 [thread overview]
Message-ID: <52813CD4.30600@iki.fi> (raw)
In-Reply-To: <s5hob5rq6dz.wl%tiwai@suse.de>
11.11.2013 17:56, Takashi Iwai kirjoitti:
> At Sun, 10 Nov 2013 20:29:17 +0200,
> Anssi Hannula wrote:
>>
>> The channel selection currently does not work properly when there is a
>> driver-provided non-ALSA-traditional channel map but no manual channel
>> map was explicitely requested with "-m".
>>
>> For example, the CEA/HDMI 8ch map is FL,FR,RLC,RRC,FC,LFE,RL,RR. Note
>> that it is otherwise the same as the traditional ALSA channel map,
>> except that the traditional rear speakers are considered
>> rear-center speakers and the traditional side speakers are considered
>> rear speakers.
>>
>> Speaker-test tries to play back channels in this following order:
>> 0, /* Front Left */
>> 4, /* Center */
>> 1, /* Front Right */
>> 7, /* Side Right */
>> 3, /* Rear Right */
>> 2, /* Rear Left */
>> 6, /* Side Left */
>> 5, /* LFE */
>>
>> When it is the time to play back Side Left/Right, speaker-test tries to
>> look for SL/SR in the chmap, but doesn't find it, so it just plays back
>> channels 6/7 (which indeed are the side speakers, or RL/RR in this
>> channel map - so the correct channels are selected).
>>
>> When it becomes the time to playback Rear Left/Right, speaker-test again
>> tries to find RL/RR in the chmap, and this time it does find them in the
>> chmap positions 6/7.
>>
>> So the channels 6/7 are tested twice and 2/3 are never tested.
>>
>> To fix this, define a generic playback order to be used when a channel
>> map is present and assign the speaker numbers (i.e. playback order) in
>> the following order:
>> 1. channels in map found in map_order[] in the map_order[] order,
>> 2. channels in map not found in map_order[] in map order,
>> 3. channels outside the map.
>
> You are referring to the teaching of Zen, aren't you...? ;)
Heh, I only realized afterwards how confusing that map order stuff sounds :p
> I prefer something a bit more easier to understand.
> For example, how about to sort the given channels once using a weight
> table?
OK, I'll try something like that.
> thanks,
>
> Takashi
>
>> When the channel mapping is specified manually, the specified order is
>> used for playback as before.
>>
>> Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
>> ---
>> speaker-test/speaker-test.c | 86 +++++++++++++++++++++++++++++++++++----------
>> 1 file changed, 67 insertions(+), 19 deletions(-)
>>
>> diff --git a/speaker-test/speaker-test.c b/speaker-test/speaker-test.c
>> index d35065f..274007d 100644
>> --- a/speaker-test/speaker-test.c
>> +++ b/speaker-test/speaker-test.c
>> @@ -88,6 +88,8 @@ enum {
>> #define BE_INT(v) (v)
>> #endif
>>
>> +#define ARRAY_SIZE(x) (int)(sizeof(x)/sizeof(x[0]))
>> +
>> static char *device = "default"; /* playback device */
>> static snd_pcm_format_t format = SND_PCM_FORMAT_S16; /* sample format */
>> static unsigned int rate = 48000; /* stream rate */
>> @@ -156,36 +158,82 @@ static const int channels8[] = {
>> 5, /* LFE */
>> };
>>
>> +#ifdef CONFIG_SUPPORT_CHMAP
>> +/* generic version of the above channelsX[] */
>> +static const int map_order[] = {
>> + SND_CHMAP_FLW,
>> + SND_CHMAP_FL,
>> + SND_CHMAP_TFL,
>> + SND_CHMAP_FLC,
>> + SND_CHMAP_TFLC,
>> + SND_CHMAP_FC,
>> + SND_CHMAP_TFC,
>> + SND_CHMAP_FRC,
>> + SND_CHMAP_TFRC,
>> + SND_CHMAP_FR,
>> + SND_CHMAP_TFR,
>> + SND_CHMAP_FRW,
>> + SND_CHMAP_SR,
>> + SND_CHMAP_TSR,
>> + SND_CHMAP_RR,
>> + SND_CHMAP_TRR,
>> + SND_CHMAP_RRC,
>> + SND_CHMAP_RC,
>> + SND_CHMAP_TRC,
>> + SND_CHMAP_RLC,
>> + SND_CHMAP_RL,
>> + SND_CHMAP_TRL,
>> + SND_CHMAP_SL,
>> + SND_CHMAP_TSL,
>> + SND_CHMAP_BC,
>> + SND_CHMAP_TC,
>> + SND_CHMAP_LLFE,
>> + SND_CHMAP_LFE,
>> + SND_CHMAP_RLFE,
>> +};
>> +
>> static int get_mapped_channel(int chn)
>> {
>> -#ifdef CONFIG_SUPPORT_CHMAP
>> - static const int maps[MAX_CHANNELS] = {
>> - SND_CHMAP_FL,
>> - SND_CHMAP_FR,
>> - SND_CHMAP_RL,
>> - SND_CHMAP_RR,
>> - SND_CHMAP_FC,
>> - SND_CHMAP_LFE,
>> - SND_CHMAP_SL,
>> - SND_CHMAP_SR,
>> - };
>> + int found_count = 0;
>> + int i, j;
>> +
>> + if (chn >= channel_map->channels)
>> + return chn; /* out of map */
>>
>> - if (channel_map && maps[chn]) {
>> - int i;
>> - for (i = 0; i < channel_map->channels; i++) {
>> - if (channel_map->pos[i] == maps[chn])
>> - return i;
>> + for (i = 0; i < ARRAY_SIZE(map_order) && found_count <= chn; i++) {
>> + for (j = 0; j < channel_map->channels; j++) {
>> + if (channel_map->pos[j] == map_order[i]) {
>> + found_count++;
>> + break;
>> + }
>> }
>> }
>> -#endif
>> - return chn;
>> +
>> + if (found_count == chn + 1)
>> + return j;
>> +
>> + /* chn is bigger than the amount of present map_order[] channels, find
>> + * the non-map_order[] channels */
>> + for (j = 0; j < channel_map->channels && found_count <= chn; j++) {
>> + for (i = 0; i < ARRAY_SIZE(map_order); i++) {
>> + if (channel_map->pos[j] == map_order[i])
>> + break;
>> + }
>> + if (i == ARRAY_SIZE(map_order))
>> + found_count++;
>> + }
>> +
>> + return j - 1;
>> }
>> +#endif
>>
>> static int get_speaker_channel(int chn)
>> {
>> #ifdef CONFIG_SUPPORT_CHMAP
>> if (channel_map_set)
>> return chn;
>> + if (channel_map)
>> + return get_mapped_channel(chn);
>> #endif
>>
>> switch (channels) {
>> @@ -200,7 +248,7 @@ static int get_speaker_channel(int chn)
>> break;
>> }
>>
>> - return get_mapped_channel(chn);
>> + return chn;
>> }
>>
>> static const char *get_channel_name(int chn)
>> --
>> 1.8.1.5
>>
--
Anssi Hannula
next prev parent reply other threads:[~2013-11-11 20:23 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-24 18:10 [PATCH v3 0/5] ALSA: hda - hdmi: ATI/AMD multi-channel and HBR support Anssi Hannula
2013-10-24 18:10 ` [PATCH 1/5] ALSA: hda - hdmi: Allow HDA patches to customize more operations Anssi Hannula
2013-10-24 18:10 ` [PATCH 2/5] ALSA: hda - hdmi: Add ATI/AMD multi-channel audio support Anssi Hannula
2013-10-24 18:10 ` [PATCH 3/5] ALSA: hda - hdmi: Add ELD emulation for ATI/AMD codecs Anssi Hannula
2013-10-24 18:10 ` [PATCH 4/5] ALSA: hda - hdmi: Add HBR bitstreaming support for ATI/AMD HDMI codecs Anssi Hannula
2013-10-24 18:10 ` [PATCH 5/5] ALSA: hda - hdmi: Disable ramp-up/down for non-PCM on AMD codecs Anssi Hannula
2013-10-24 19:00 ` Anssi Hannula
2013-10-24 18:26 ` [PATCH v3 0/5] ALSA: hda - hdmi: ATI/AMD multi-channel and HBR support Anssi Hannula
2013-11-08 5:08 ` Olivier Langlois
2013-11-08 10:27 ` Anssi Hannula
2013-11-08 18:17 ` Olivier Langlois
2013-11-08 21:28 ` Olivier Langlois
2013-11-08 22:03 ` Anssi Hannula
2013-11-10 5:42 ` Olivier Langlois
2013-11-10 6:01 ` Anssi Hannula
2013-11-10 7:25 ` speaker-test chmap bugs (was: [PATCH v3 0/5] ALSA: hda - hdmi: ATI/AMD multi-channel and HBR support) Anssi Hannula
2013-11-10 18:29 ` [PATCH 1/3] speaker-test: Fix chmapped channel selection without specified chmap Anssi Hannula
2013-11-10 18:29 ` [PATCH 2/3] speaker-test: Always show chmap channel names if available Anssi Hannula
2013-11-10 18:29 ` [PATCH 3/3] speaker-test: Show out-of-chmap channels as Unknown Anssi Hannula
2013-11-11 15:56 ` [PATCH 1/3] speaker-test: Fix chmapped channel selection without specified chmap Takashi Iwai
2013-11-11 20:23 ` Anssi Hannula [this message]
2013-11-11 22:04 ` [PATCH 1/3 v2] " Anssi Hannula
2013-11-12 8:11 ` Takashi Iwai
2013-11-12 12:34 ` Anssi Hannula
2013-11-12 13:08 ` Takashi Iwai
2013-11-12 6:35 ` [PATCH v3 0/5] ALSA: hda - hdmi: ATI/AMD multi-channel and HBR support Olivier Langlois
2013-11-14 0:04 ` Anssi Hannula
2013-11-09 8:35 ` Takashi Iwai
2013-10-24 23:04 ` Takashi Iwai
2013-10-25 16:54 ` Andre Heider
2013-10-25 17:13 ` Takashi Iwai
2013-10-25 17:23 ` Anssi Hannula
2013-10-25 18:25 ` Andre Heider
2013-10-28 17:52 ` Andre Heider
2013-10-28 18:12 ` Anssi Hannula
2013-10-28 18:17 ` Andre Heider
2013-10-28 18:25 ` Anssi Hannula
2013-10-28 18:35 ` Andre Heider
2013-10-28 20:35 ` Anssi Hannula
2013-10-28 22:00 ` Andre Heider
2013-10-28 22:42 ` Anssi Hannula
2013-10-28 23:15 ` Andre Heider
2013-10-29 19:52 ` LANGLOIS Olivier PIS -EXT
2013-10-29 20:30 ` Anssi Hannula
2013-10-28 23:19 ` [PATCH] drm/radeon/audio: fix missing multichannel PCM SAD in some cases Anssi Hannula
2013-10-31 23:38 ` Rafał Miłecki
2013-10-31 23:46 ` Rafał Miłecki
2013-10-31 23:52 ` Anssi Hannula
2013-11-02 1:01 ` Rafał Miłecki
2013-11-02 1:08 ` Anssi Hannula
2013-11-02 1:15 ` Rafał Miłecki
2013-11-02 1:03 ` Rafał Miłecki
2013-11-02 15:32 ` [PATCH v3 0/5] ALSA: hda - hdmi: ATI/AMD multi-channel and HBR support Anssi Hannula
2013-11-23 1:05 ` James Le Cuirot
2013-11-23 1:29 ` Anssi Hannula
2013-11-23 15:40 ` James Le Cuirot
2013-11-23 15:45 ` Anssi Hannula
2013-11-24 14:57 ` James Le Cuirot
2013-11-25 13:20 ` Anssi Hannula
2013-11-25 14:32 ` James Le Cuirot
2013-11-25 14:56 ` Anssi Hannula
2014-05-13 12:01 ` James Le Cuirot
2014-05-13 12:27 ` Anssi Hannula
2014-05-13 16:16 ` James Le Cuirot
2014-05-13 21:10 ` James Le Cuirot
2014-05-13 21:50 ` Anssi Hannula
2014-05-14 13:04 ` Deucher, Alexander
2014-05-14 13:19 ` James Le Cuirot
2013-11-25 15:07 ` Raymond Yau
2013-11-25 15:32 ` James Le Cuirot
2013-11-25 19:35 ` Anssi Hannula
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52813CD4.30600@iki.fi \
--to=anssi.hannula@iki.fi \
--cc=alsa-devel@alsa-project.org \
--cc=fritsch@xbmc.org \
--cc=olivier@trillion01.com \
--cc=tiwai@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.