alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
To: Mark Brown <broonie@kernel.org>
Cc: Sameer Pujar <spujar@nvidia.com>,
	Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>,
	Linux-ALSA <alsa-devel@alsa-project.org>
Subject: Re: More Generic Audio Graph Sound Card idea
Date: 13 Oct 2020 13:50:25 +0900	[thread overview]
Message-ID: <87imbeybq5.wl-kuninori.morimoto.gx@renesas.com> (raw)
In-Reply-To: <87k0xszlep.wl-kuninori.morimoto.gx@renesas.com>


Hi ALSA ML


> I'm thinking below style as new audio-graph-card2.
> It is not tricky, thus connection judgement for normal vs DSP is easy.
> Then, code can be more readable (= no guaranty :P) ?

I have proposed DPCM connection idea for audio-card2 before,
and proposed Multi-CPU/Codec connection idea later.
I'm not yet implemented these, but I want to merge / reuse these
idea to keep simple code.

By this mail, I want to propose Codec2Codec idea.
It is almost same idea with DPCM, Multi-CPU/Codec,
and is last parts for missing feature.

I think this idea can be generic and easy to update
in the future (if needed).

But, I want feedback, opinion.
I wonder does it works for your use-case ?

-- Image ---

Codec2Codec

Codec1 <--> Codec2

-- DT Image --

   +--+
=> |  |<--> Codec1
   |  |<--> Codec2
   +--+

-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		dais = <&codec2codec>;
	};

	CODEC2CODEC {
		compatible = "audio-graph-card2-codec2codec";

		ports {
			codec2codec: port@0 { fe_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
			             port@1 { be_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
		};
	};

 	Codec1 {
		port@0 { codec1_ep: endpoint { remote-endpoint = <&fe_ep>; }; };
	};

 	Codec2 {
		port@0 { codec2_ep: endpoint { remote-endpoint = <&be_ep>; }; };
	};


-- Image ---

          *******
PCM0 <--> *     * <--> DAI0: Codec Headset
PCM1 <--> *     * <--> DAI1: Codec Speakers
PCM2 <--> * DSP * <--> DAI2: MODEM
PCM3 <--> *     * <--> DAI3: BT
          *     * <--> DAI4: DMIC
          *     * <--> DAI5: FM
          *******

-- DT Image --

   +--+                ****                 +--+
=> |  |<--> PCM0       *  * <-- (dummy) --> |  | <=
   |  |<-- (dummy) --> *  *       DAI0 <--> |  |
   +--+                *  *                 +--+
                       *  *            
   +--+                *  *                 +--+
=> |  |<--> PCM1       *  * <-- (dummy) --> |  | <=
   |  |<-- (dummy) --> *  *       DAI1 <--> |  |
   +--+                *  *                 +--+
   ...                 ...                 ...


-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		/* indicate all Front-End, Back-End in DPCM case */
		dais = <&dsp_fe0, &dsp_fe1, &dsp_fe2, &dsp_fe3,
		        &dsp_be0, &dsp_be1, &dsp_be2, &dsp_be3, &dsp_be4, &dsp_be5>;
	};

	DSP {
		compatible = "audio-graph-card2-dsp";

		ports@0 {
			/* Front-End is pcm0_ep, Back-End is dummy */
			dsp_fe0: port@0 { dsp_fe0_ep: endpoint { remote-endpoint = <&pcm0_ep>; }; };
			         port@1 { };
		};

		...

		ports@4 {
			/* Front-End is dummy, Back-End is dai_ep */
			dsp_be0: port@0 { };
			         port@1 { dsp_be0_ep: endpoint { remote-endpoint = <&dai0_ep>; }; };
		};

		...

	};

 	CPU {
		ports {
			port@0 { pcm0_ep: endpoint { remote-endpoint = <&dsp_fe0_ep>; }; };
			port@1 { pcm1_ep: endpoint { remote-endpoint = <&dsp_fe1_ep>; }; };
			port@2 { pcm2_ep: endpoint { remote-endpoint = <&dsp_fe2_ep>; }; };
			port@3 { pcm3_ep: endpoint { remote-endpoint = <&dsp_fe3_ep>; }; };
			...
		};
	};

	Codec {
		ports {
			port@0 { dai0_ep: endpoint { remote-endpoint = <&dsp_be0_ep>; }; };
			port@1 { dai1_ep: endpoint { remote-endpoint = <&dsp_be1_ep>; }; };
			port@2 { dai2_ep: endpoint { remote-endpoint = <&dsp_be2_ep>; }; };
			port@3 { dai3_ep: endpoint { remote-endpoint = <&dsp_be3_ep>; }; };
			port@4 { dai4_ep: endpoint { remote-endpoint = <&dsp_be4_ep>; }; };
			port@5 { dai5_ep: endpoint { remote-endpoint = <&dsp_be5_ep>; }; };
			...
		};
	};


-- Image ---

As Sample, Normal Audio-Graph

CPU <---> Codec (Same as before)

-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		dais = <&cpu>;
	};

	CPU {
		cpu: port { cpu_ep: endpoint { remote-endpoint = <&codec_ep>; }; };
	};

	Codec {
		codec: port { codec_ep: endpoint { remote-endpoint = <&cpu_ep>; }; };
	};


-- Image ---

Multi-CPU/Codec
(complex connection as sample)

<- multi_CPU_0 ->
           ******
CPU01 <--> *    * <--> Codec0
       \-> *    *
CPU02 <--> *    *
           ******

           <-- multi_codec_1 -->
          ******
CPU1 <--> *    * <--> Codec11
          *    * <-/
          *    * <--> Codec12
          ******

-- DT Image --

   +--+                     +--+
=> |  | <--> CPU01_1     => |  | <--> CPU1
   |  | <--> CPU01_2        |  |
   |  | <--> CPU02          |  | <--> Codec11_1
   |  |                     |  | <--> Codec11_2
   |  | <--> Codec0         |  | <--> Codec12
   +--+                     +--+

-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		dais = <&cpu_0,
		        &cpu_1>;
	};

	MULTI0 {
		compatible = "audio-graph-card2-multi";

		cpu_0: ports@0 {
			port@0 { fe0_1_ep: endpoint { remote-endpoint = <&cpu01_1_ep>; }; };
			port@1 { fe0_2_ep: endpoint { remote-endpoint = <&cpu01_2_ep>; }; };
			port@2 { fe0_3_ep: endpoint { remote-endpoint = <&cpu02_ep>; }; };
		};
		ports@1 {
			port@0 { be0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
		};
	};

	MULTI1 {
		compatible = "audio-graph-card2-multi";

		cpu_1: ports@0 {
			port@0 { fe1_ep: endpoint { remote-endpoint = <&cpu1_ep>; }; };
		};
		ports@1 {
			port@0 { be1_1_ep: endpoint { remote-endpoint = <&codec11_1_ep>; }; };
			port@1 { be1_2_ep: endpoint { remote-endpoint = <&codec11_2_ep>; }; };
			port@2 { be1_3_ep: endpoint { remote-endpoint = <&codec12_ep>; }; };
		};
	};

	CPU01 {
		ports {
			port@0 { cpu01_1_ep: endpoint { remote-endpoint = <&fe0_1_ep>; }; };
			port@1 { cpu01_2_ep: endpoint { remote-endpoint = <&fe0_2_ep>; }; };
			...
		};
	};

	CPU02 {
		ports {
			port@0 { cpu02_ep: endpoint { remote-endpoint = <&fe0_3_ep>; }; };
			...
		};
	};

	CPU1 {
		ports {
			port@0 { cpu1_ep: endpoint { remote-endpoint = <&fe1_ep>; }; };
			...
		};
	};

	Codec0 {
		ports {
			port@0 { codec0_ep: endpoint { remote-endpoint = <&be0_ep>; }; };
			port@1 { ... };
		};
	};

	Codec11 {
		ports {
			port@0 { codec11_1_ep: endpoint { remote-endpoint = <&be1_1_ep>; }; };
			port@1 { codec11_2_ep: endpoint { remote-endpoint = <&be1_2_ep>; }; };
			port@2 { ... };
		};
	};

	Codec12 {
		ports {
			port@0 { codec12_ep: endpoint { remote-endpoint = <&be1_3_ep>; }; };
			port@1 { ... };
		};
	};

  parent reply	other threads:[~2020-10-13  4:51 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-21  4:15 More Generic Audio Graph Sound Card idea Kuninori Morimoto
2020-08-21  5:26 ` Sameer Pujar
2020-08-21  7:14   ` Kuninori Morimoto
2020-08-21  8:28     ` Sameer Pujar
2020-08-21 13:02       ` Mark Brown
2020-09-25  1:43     ` Kuninori Morimoto
2020-09-25 19:22       ` Mark Brown
2020-09-25 20:04         ` Pierre-Louis Bossart
2020-09-25 20:10           ` Mark Brown
2020-09-25 20:50             ` Pierre-Louis Bossart
2020-08-21  7:11 ` Daniel Baluta
2020-08-21  7:25   ` Kuninori Morimoto
2020-08-21  7:33     ` Daniel Baluta
2020-08-21 11:47     ` Mark Brown
2020-08-21 12:18 ` Mark Brown
2020-08-24  0:25   ` Kuninori Morimoto
2020-08-24  6:25     ` Sameer Pujar
2020-08-25  0:59       ` Kuninori Morimoto
2020-08-25  3:11         ` Sameer Pujar
2020-08-25  5:13           ` Kuninori Morimoto
2020-08-25  5:42             ` Sameer Pujar
2020-08-25  6:35               ` Kuninori Morimoto
2020-08-26  6:46                 ` Sameer Pujar
2020-08-27  1:18                   ` Kuninori Morimoto
2020-08-27  1:36                   ` Kuninori Morimoto
2020-09-03 23:51     ` Kuninori Morimoto
2020-09-09 11:33       ` Sameer Pujar
2020-08-21 15:49 ` Pierre-Louis Bossart
2020-10-13  4:50 ` Kuninori Morimoto [this message]
2020-10-15 14:32   ` Mark Brown
2020-10-15 23:04     ` Kuninori Morimoto

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=87imbeybq5.wl-kuninori.morimoto.gx@renesas.com \
    --to=kuninori.morimoto.gx@renesas.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=spujar@nvidia.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).