[alsa-devel] [PATCH 0/2] ASoC updates
The following changes since commit 32c8dabc97d436582298ebd0e33af041c69f5a4b: Mark Brown (1): ASoC: Remove obsolete declaration of struct snd_soc_clock_info
are available in the git repository at:
git://opensource.wolfsonmicro.com/linux-2.6-asoc for-tiwai
Daniel Mack (1): ASoC: tlv320aic3x: control additions and cleanups
Grazvydas Ignotas (1): ASoC: Add support for OMAP3 Pandora
sound/soc/codecs/tlv320aic3x.c | 18 ++- sound/soc/omap/Kconfig | 8 + sound/soc/omap/Makefile | 2 + sound/soc/omap/omap3pandora.c | 311 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 334 insertions(+), 5 deletions(-) create mode 100644 sound/soc/omap/omap3pandora.c
From: Grazvydas Ignotas notasas@gmail.com
This patch adds basic support for OMAP3 Pandora.
Signed-off-by: Grazvydas Ignotas notasas@gmail.com Signed-off-by: Mark Brown broonie@opensource.wolfsonmicro.com --- sound/soc/omap/Kconfig | 8 + sound/soc/omap/Makefile | 2 + sound/soc/omap/omap3pandora.c | 311 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 321 insertions(+), 0 deletions(-) create mode 100644 sound/soc/omap/omap3pandora.c
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index da39f27..a7b1d77 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig @@ -46,3 +46,11 @@ config SND_OMAP_SOC_SDP3430 help Say Y if you want to add support for SoC audio on Texas Instruments SDP3430. + +config SND_OMAP_SOC_OMAP3_PANDORA + tristate "SoC Audio support for OMAP3 Pandora" + depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3_PANDORA + select SND_OMAP_SOC_MCBSP + select SND_SOC_TWL4030 + help + Say Y if you want to add support for SoC audio on the OMAP3 Pandora. diff --git a/sound/soc/omap/Makefile b/sound/soc/omap/Makefile index 29cf3a8..76fedd9 100644 --- a/sound/soc/omap/Makefile +++ b/sound/soc/omap/Makefile @@ -11,9 +11,11 @@ snd-soc-osk5912-objs := osk5912.o snd-soc-overo-objs := overo.o snd-soc-omap2evm-objs := omap2evm.o snd-soc-sdp3430-objs := sdp3430.o +snd-soc-omap3pandora-objs := omap3pandora.o
obj-$(CONFIG_SND_OMAP_SOC_N810) += snd-soc-n810.o obj-$(CONFIG_SND_OMAP_SOC_OSK5912) += snd-soc-osk5912.o obj-$(CONFIG_SND_OMAP_SOC_OVERO) += snd-soc-overo.o obj-$(CONFIG_MACH_OMAP2EVM) += snd-soc-omap2evm.o obj-$(CONFIG_SND_OMAP_SOC_SDP3430) += snd-soc-sdp3430.o +obj-$(CONFIG_SND_OMAP_SOC_OMAP3_PANDORA) += snd-soc-omap3pandora.o diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c new file mode 100644 index 0000000..bd91594 --- /dev/null +++ b/sound/soc/omap/omap3pandora.c @@ -0,0 +1,311 @@ +/* + * omap3pandora.c -- SoC audio for Pandora Handheld Console + * + * Author: Gražvydas Ignotas notasas@gmail.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include <linux/clk.h> +#include <linux/platform_device.h> +#include <linux/gpio.h> +#include <linux/delay.h> + +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/soc.h> +#include <sound/soc-dapm.h> + +#include <asm/mach-types.h> + +#include "omap-mcbsp.h" +#include "omap-pcm.h" +#include "../codecs/twl4030.h" + +#define OMAP3_PANDORA_DAC_POWER_GPIO 118 +#define OMAP3_PANDORA_AMP_POWER_GPIO 14 + +#define PREFIX "ASoC omap3pandora: " + +static int omap3pandora_cmn_hw_params(struct snd_soc_dai *codec_dai, + struct snd_soc_dai *cpu_dai, unsigned int fmt) +{ + int ret; + + /* Set codec DAI configuration */ + ret = snd_soc_dai_set_fmt(codec_dai, fmt); + if (ret < 0) { + pr_err(PREFIX "can't set codec DAI configuration\n"); + return ret; + } + + /* Set cpu DAI configuration */ + ret = snd_soc_dai_set_fmt(cpu_dai, fmt); + if (ret < 0) { + pr_err(PREFIX "can't set cpu DAI configuration\n"); + return ret; + } + + /* Set the codec system clock for DAC and ADC */ + ret = snd_soc_dai_set_sysclk(codec_dai, 0, 26000000, + SND_SOC_CLOCK_IN); + if (ret < 0) { + pr_err(PREFIX "can't set codec system clock\n"); + return ret; + } + + /* Set McBSP clock to external */ + ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_EXT, 0, + SND_SOC_CLOCK_IN); + if (ret < 0) { + pr_err(PREFIX "can't set cpu system clock\n"); + return ret; + } + + ret = snd_soc_dai_set_clkdiv(cpu_dai, OMAP_MCBSP_CLKGDV, 8); + if (ret < 0) { + pr_err(PREFIX "can't set SRG clock divider\n"); + return ret; + } + + return 0; +} + +static int omap3pandora_out_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + + return omap3pandora_cmn_hw_params(codec_dai, cpu_dai, + SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_IB_NF | + SND_SOC_DAIFMT_CBS_CFS); +} + +static int omap3pandora_in_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + + return omap3pandora_cmn_hw_params(codec_dai, cpu_dai, + SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS); +} + +static int omap3pandora_hp_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *k, int event) +{ + if (SND_SOC_DAPM_EVENT_ON(event)) { + gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 1); + gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 1); + } else { + gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 0); + mdelay(1); + gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 0); + } + + return 0; +} + +/* + * Audio paths on Pandora board: + * + * |O| ---> PCM DAC +-> AMP -> Headphone Jack + * |M| A +--------> Line Out + * |A| <~~clk~~+ + * |P| <--- TWL4030 <--------- Line In and MICs + */ +static const struct snd_soc_dapm_widget omap3pandora_out_dapm_widgets[] = { + SND_SOC_DAPM_DAC("PCM DAC", "Playback", SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_PGA_E("Headphone Amplifier", SND_SOC_NOPM, + 0, 0, NULL, 0, omap3pandora_hp_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), + SND_SOC_DAPM_HP("Headphone Jack", NULL), + SND_SOC_DAPM_LINE("Line Out", NULL), +}; + +static const struct snd_soc_dapm_widget omap3pandora_in_dapm_widgets[] = { + SND_SOC_DAPM_MIC("Mic (Internal)", NULL), + SND_SOC_DAPM_MIC("Mic (external)", NULL), + SND_SOC_DAPM_LINE("Line In", NULL), +}; + +static const struct snd_soc_dapm_route omap3pandora_out_map[] = { + {"Headphone Amplifier", NULL, "PCM DAC"}, + {"Line Out", NULL, "PCM DAC"}, + {"Headphone Jack", NULL, "Headphone Amplifier"}, +}; + +static const struct snd_soc_dapm_route omap3pandora_in_map[] = { + {"INL", NULL, "Line In"}, + {"INR", NULL, "Line In"}, + {"INL", NULL, "Mic (Internal)"}, + {"INR", NULL, "Mic (external)"}, +}; + +static int omap3pandora_out_init(struct snd_soc_codec *codec) +{ + int ret; + + ret = snd_soc_dapm_new_controls(codec, omap3pandora_out_dapm_widgets, + ARRAY_SIZE(omap3pandora_out_dapm_widgets)); + if (ret < 0) + return ret; + + snd_soc_dapm_add_routes(codec, omap3pandora_out_map, + ARRAY_SIZE(omap3pandora_out_map)); + + return snd_soc_dapm_sync(codec); +} + +static int omap3pandora_in_init(struct snd_soc_codec *codec) +{ + int ret; + + ret = snd_soc_dapm_new_controls(codec, omap3pandora_in_dapm_widgets, + ARRAY_SIZE(omap3pandora_in_dapm_widgets)); + if (ret < 0) + return ret; + + snd_soc_dapm_add_routes(codec, omap3pandora_in_map, + ARRAY_SIZE(omap3pandora_in_map)); + + return snd_soc_dapm_sync(codec); +} + +static struct snd_soc_ops omap3pandora_out_ops = { + .hw_params = omap3pandora_out_hw_params, +}; + +static struct snd_soc_ops omap3pandora_in_ops = { + .hw_params = omap3pandora_in_hw_params, +}; + +/* Digital audio interface glue - connects codec <--> CPU */ +static struct snd_soc_dai_link omap3pandora_dai[] = { + { + .name = "PCM1773", + .stream_name = "HiFi Out", + .cpu_dai = &omap_mcbsp_dai[0], + .codec_dai = &twl4030_dai, + .ops = &omap3pandora_out_ops, + .init = omap3pandora_out_init, + }, { + .name = "TWL4030", + .stream_name = "Line/Mic In", + .cpu_dai = &omap_mcbsp_dai[1], + .codec_dai = &twl4030_dai, + .ops = &omap3pandora_in_ops, + .init = omap3pandora_in_init, + } +}; + +/* SoC card */ +static struct snd_soc_card snd_soc_card_omap3pandora = { + .name = "omap3pandora", + .platform = &omap_soc_platform, + .dai_link = omap3pandora_dai, + .num_links = ARRAY_SIZE(omap3pandora_dai), +}; + +/* Audio subsystem */ +static struct snd_soc_device omap3pandora_snd_data = { + .card = &snd_soc_card_omap3pandora, + .codec_dev = &soc_codec_dev_twl4030, +}; + +static struct platform_device *omap3pandora_snd_device; + +static int __init omap3pandora_soc_init(void) +{ + int ret; + + if (!machine_is_omap3_pandora()) { + pr_debug(PREFIX "Not OMAP3 Pandora\n"); + return -ENODEV; + } + pr_info("OMAP3 Pandora SoC init\n"); + + ret = gpio_request(OMAP3_PANDORA_DAC_POWER_GPIO, "dac_power"); + if (ret) { + pr_err(PREFIX "Failed to get DAC power GPIO\n"); + return ret; + } + + ret = gpio_direction_output(OMAP3_PANDORA_DAC_POWER_GPIO, 0); + if (ret) { + pr_err(PREFIX "Failed to set DAC power GPIO direction\n"); + goto fail0; + } + + ret = gpio_request(OMAP3_PANDORA_AMP_POWER_GPIO, "amp_power"); + if (ret) { + pr_err(PREFIX "Failed to get amp power GPIO\n"); + goto fail0; + } + + ret = gpio_direction_output(OMAP3_PANDORA_AMP_POWER_GPIO, 0); + if (ret) { + pr_err(PREFIX "Failed to set amp power GPIO direction\n"); + goto fail1; + } + + omap3pandora_snd_device = platform_device_alloc("soc-audio", -1); + if (omap3pandora_snd_device == NULL) { + pr_err(PREFIX "Platform device allocation failed\n"); + ret = -ENOMEM; + goto fail1; + } + + platform_set_drvdata(omap3pandora_snd_device, &omap3pandora_snd_data); + omap3pandora_snd_data.dev = &omap3pandora_snd_device->dev; + *(unsigned int *)omap_mcbsp_dai[0].private_data = 1; /* McBSP2 */ + *(unsigned int *)omap_mcbsp_dai[1].private_data = 3; /* McBSP4 */ + + ret = platform_device_add(omap3pandora_snd_device); + if (ret) { + pr_err(PREFIX "Unable to add platform device\n"); + goto fail2; + } + + return 0; + +fail2: + platform_device_put(omap3pandora_snd_device); +fail1: + gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO); +fail0: + gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO); + return ret; +} +module_init(omap3pandora_soc_init); + +static void __exit omap3pandora_soc_exit(void) +{ + platform_device_unregister(omap3pandora_snd_device); + gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO); + gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO); +} +module_exit(omap3pandora_soc_exit); + +MODULE_AUTHOR("Grazvydas Ignotas notasas@gmail.com"); +MODULE_DESCRIPTION("ALSA SoC OMAP3 Pandora"); +MODULE_LICENSE("GPL");
From: Daniel Mack daniel@caiaq.org
- split "Line Playback Switch" into "LineL Playback Switch" and "LineR Playback Switch" - split "Line PGA Bypass Playback Volume" into "LineL Left PGA Bypass Playback Volume" and "LineR Right PGA Bypass Playback Volume" - split "Line Line2 Bypass Playback Volume" into "LineL Line2 Bypass Playback Volume" and "LineR Line2 Bypass Playback Volume" - Added "HP Right PGA Bypass Playback Volume"
Signed-off-by: Daniel Mack daniel@caiaq.de Signed-off-by: Mark Brown broonie@opensource.wolfsonmicro.com --- sound/soc/codecs/tlv320aic3x.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 341e1ad..6a05829 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -253,11 +253,17 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
SOC_DOUBLE_R("Line DAC Playback Volume", DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL, 0, 0x7f, 1), - SOC_DOUBLE_R("Line DAC Playback Switch", LLOPM_CTRL, RLOPM_CTRL, 3, - 0x01, 0), - SOC_DOUBLE_R("Line PGA Bypass Playback Volume", PGAL_2_LLOPM_VOL, - PGAR_2_RLOPM_VOL, 0, 0x7f, 1), - SOC_DOUBLE_R("Line Line2 Bypass Playback Volume", LINE2L_2_LLOPM_VOL, + SOC_SINGLE("LineL Playback Switch", LLOPM_CTRL, 3, 0x01, 0), + SOC_SINGLE("LineR Playback Switch", RLOPM_CTRL, 3, 0x01, 0), + SOC_DOUBLE_R("LineL DAC Playback Volume", DACL1_2_LLOPM_VOL, + DACR1_2_LLOPM_VOL, 0, 0x7f, 1), + SOC_SINGLE("LineL Left PGA Bypass Playback Volume", PGAL_2_LLOPM_VOL, + 0, 0x7f, 1), + SOC_SINGLE("LineR Right PGA Bypass Playback Volume", PGAR_2_RLOPM_VOL, + 0, 0x7f, 1), + SOC_DOUBLE_R("LineL Line2 Bypass Playback Volume", LINE2L_2_LLOPM_VOL, + LINE2R_2_LLOPM_VOL, 0, 0x7f, 1), + SOC_DOUBLE_R("LineR Line2 Bypass Playback Volume", LINE2L_2_RLOPM_VOL, LINE2R_2_RLOPM_VOL, 0, 0x7f, 1),
SOC_DOUBLE_R("Mono DAC Playback Volume", DACL1_2_MONOLOPM_VOL, @@ -272,6 +278,8 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = { DACR1_2_HPROUT_VOL, 0, 0x7f, 1), SOC_DOUBLE_R("HP DAC Playback Switch", HPLOUT_CTRL, HPROUT_CTRL, 3, 0x01, 0), + SOC_DOUBLE_R("HP Right PGA Bypass Playback Volume", PGAR_2_HPLOUT_VOL, + PGAR_2_HPROUT_VOL, 0, 0x7f, 1), SOC_SINGLE("HPL PGA Bypass Playback Volume", PGAL_2_HPLOUT_VOL, 0, 0x7f, 1), SOC_SINGLE("HPR PGA Bypass Playback Volume", PGAL_2_HPROUT_VOL,
Hi,
If my sound card supports hardware mixing, how do I need to code my sound card driver such that I can send multiple streams through ALSA to the sound card driver at the same time?
Thanks, Harsha
It does that by default. Just run multiple applications.
2008/12/5 Harsha, Priya priya.harsha@intel.com:
Hi,
If my sound card supports hardware mixing, how do I need to code my sound card driver such that I can send multiple streams through ALSA to the sound card driver at the same time?
Thanks, Harsha
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Thanks.
If I need to send a voice stream and an audio stream to the hardware as two separate streams... I just need to open 2 ALSA device from user space and send it right?
If I want to send some private data for each stream (say I want to differentiate that it's a voice/music...for which I did not find any provision) how do I do that?
-----Original Message----- From: Vedran Miletić [mailto:rivanvx@gmail.com] Sent: Friday, December 05, 2008 10:42 PM To: Harsha, Priya Cc: alsa-devel@alsa-project.org Subject: Re: [alsa-devel] question on hardware mixing
It does that by default. Just run multiple applications.
2008/12/5 Harsha, Priya priya.harsha@intel.com:
Hi,
If my sound card supports hardware mixing, how do I need to code my sound card driver such that I can send multiple streams through ALSA to the sound card driver at the same time?
Thanks, Harsha
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
On Fri, Dec 5, 2008 at 12:03 PM, Harsha, Priya priya.harsha@intel.com wrote:
Hi,
If my sound card supports hardware mixing, how do I need to code my sound card driver such that I can send multiple streams through ALSA to the sound card driver at the same time?
Check out the emu10k1 driver. You need something like the voice allocator in that driver that assigns a hardware mixing channel or channels when ALSA asks the driver for a new PCM stream.
User space would open the same device multiple times (up to the hardware voice limit) and the driver manages the allocations. From userspace POV a hardware mixing device looks just like a single stream device, but it doesn't return -EBUSY when you open it multiple times.
Lee
Hi,
Thanks.
A quick follow up question. In the trigger function - I see that from substream->runtime->private_data, voice specific parameters are extracted. How and can somehow user space fill in some private data to the driver so that driver can process voice in a different way and music in a different way?
Thanks, Harsha
-----Original Message----- From: rlrevell@gmail.com [mailto:rlrevell@gmail.com] On Behalf Of Lee Revell Sent: Saturday, December 06, 2008 10:29 AM To: Harsha, Priya Cc: alsa-devel@alsa-project.org Subject: Re: [alsa-devel] question on hardware mixing
On Fri, Dec 5, 2008 at 12:03 PM, Harsha, Priya priya.harsha@intel.com wrote:
Hi,
If my sound card supports hardware mixing, how do I need to code my sound card driver such that I can send multiple streams through ALSA to the sound card driver at the same time?
Check out the emu10k1 driver. You need something like the voice allocator in that driver that assigns a hardware mixing channel or channels when ALSA asks the driver for a new PCM stream.
User space would open the same device multiple times (up to the hardware voice limit) and the driver manages the allocations. From userspace POV a hardware mixing device looks just like a single stream device, but it doesn't return -EBUSY when you open it multiple times.
Lee
On Sat, Dec 6, 2008 at 1:56 AM, Harsha, Priya priya.harsha@intel.com wrote:
Hi,
Thanks.
A quick follow up question. In the trigger function - I see that from substream->runtime->private_data, voice specific parameters are extracted. How and can somehow user space fill in some private data to the driver so that driver can process voice in a different way and music in a different way?
What exactly do you want to do differently?
Lee
I have a DSP engine with FW. I need to pass this information to the FW which does some processing for voice and music differently.
Thanks, Harsha
-----Original Message----- From: rlrevell@gmail.com [mailto:rlrevell@gmail.com] On Behalf Of Lee Revell Sent: Tuesday, December 09, 2008 8:46 AM To: Harsha, Priya Cc: alsa-devel@alsa-project.org Subject: Re: [alsa-devel] question on hardware mixing
On Sat, Dec 6, 2008 at 1:56 AM, Harsha, Priya priya.harsha@intel.com wrote:
Hi,
Thanks.
A quick follow up question. In the trigger function - I see that from substream->runtime->private_data, voice specific parameters are extracted. How and can somehow user space fill in some private data to the driver so that driver can process voice in a different way and music in a different way?
What exactly do you want to do differently?
Lee
I was thinking to pass this information from snd_pcm_t->private_data. This gets copied to substream->private_data internally which would reach the driver. Am I right here?
-----Original Message----- From: Harsha, Priya Sent: Tuesday, December 09, 2008 8:54 AM To: 'Lee Revell' Cc: alsa-devel@alsa-project.org Subject: RE: [alsa-devel] question on hardware mixing
I have a DSP engine with FW. I need to pass this information to the FW which does some processing for voice and music differently.
Thanks, Harsha
-----Original Message----- From: rlrevell@gmail.com [mailto:rlrevell@gmail.com] On Behalf Of Lee Revell Sent: Tuesday, December 09, 2008 8:46 AM To: Harsha, Priya Cc: alsa-devel@alsa-project.org Subject: Re: [alsa-devel] question on hardware mixing
On Sat, Dec 6, 2008 at 1:56 AM, Harsha, Priya priya.harsha@intel.com wrote:
Hi,
Thanks.
A quick follow up question. In the trigger function - I see that from substream->runtime->private_data, voice specific parameters are extracted. How and can somehow user space fill in some private data to the driver so that driver can process voice in a different way and music in a different way?
What exactly do you want to do differently?
Lee
Harsha, Priya wrote:
In the trigger function - I see that from substream->runtime->private_data, voice specific parameters are extracted. How and can somehow user space fill in some private data to the driver so that driver can process voice in a different way and music in a different way?
On the Emu10k1 chip, the hardware voices are used for both PCM playback and wavetable (MIDI) playback. Voice-specific parameters are set for MIDI data; the parameters come from the soundfont that was loaded to specify how the instruments sound. (Here, the term "voice" has no relation to the sound of a human voice.)
As far as PCM playback is concerned, ALSA does not have any predefined mechanism to differentiate between voice and music audio streams. It would be possible to define mixer controls to switch between these settings for each substream.
HTH Clemens
If I define mixer controls to switch between each substream, I would not be able to handle multiple streams at time.... I had asked this in my earlier follow up email as well - can I use snd_pcm_t->private_data to communicate if it's a voice or audio I understand this private_data gets copied to substream->private data which will reach the driver... Am I right here?
-----Original Message----- From: Clemens Ladisch [mailto:clemens@ladisch.de] Sent: Tuesday, December 09, 2008 2:23 PM To: Harsha, Priya Cc: Lee Revell; alsa-devel@alsa-project.org Subject: Re: [alsa-devel] question on hardware mixing
Harsha, Priya wrote:
In the trigger function - I see that from substream->runtime->private_data, voice specific parameters are extracted. How and can somehow user space fill in some private data to the driver so that driver can process voice in a different way and music in a different way?
On the Emu10k1 chip, the hardware voices are used for both PCM playback and wavetable (MIDI) playback. Voice-specific parameters are set for MIDI data; the parameters come from the soundfont that was loaded to specify how the instruments sound. (Here, the term "voice" has no relation to the sound of a human voice.)
As far as PCM playback is concerned, ALSA does not have any predefined mechanism to differentiate between voice and music audio streams. It would be possible to define mixer controls to switch between these settings for each substream.
HTH Clemens
On Tue, 2008-12-09 at 14:25 +0530, Harsha, Priya wrote:
If I define mixer controls to switch between each substream, I would not be able to handle multiple streams at time....
Check into the ALSA configuration file syntax -- there are number of things you can do there, like define a 'voice' device that uses hooks to set a control setting (snd_kcontrol) when you open a PCM. You can use that control setting to let your driver know if the PCM channel is being used for voice or audio traffic.
Look at how the EMU10K1 handles surround sound audio in /etc/alsa/cards/EMU10K1.conf
I started to do some similar things for sis7019 surround sound, but they've never made it out of my office due to lack of time/testing HW.
I had asked this in my earlier follow up email as well - can I use snd_pcm_t->private_data to communicate if it's a voice or audio I understand this private_data gets copied to substream->private data which will reach the driver... Am I right here?
I can't answer this specifically, but I believe the answer is in the name -- 'private'. This is for the ALSA system to use, you can hang your own data off a substream using snd_pcm_substream_chip(). Besides, how do you plan on setting it in the snd_pcm_t type?
I think that if you set up some controls, use the config file language, and have your audio apps open a 'voice' device, you can get where you want.
Dave
Hi ,
I need more help here. I tried looking at the .conf file but I have another requirement here.
Let me put my requirements here. Please suggest me ways to get this done
1. When I get a .prepare call in my driver, I need to know the stream type 2. When I return from that call, I need to send to the user the locally allocated stream id
This is specific to the sound card/ DSP I am developing the driver for. The application is also proprietary. Is this possible at all? Please suggest me ways to do the same.
Thanks, Harsha
-----Original Message----- From: David Dillow [mailto:dave@thedillows.org] Sent: Tuesday, December 09, 2008 6:14 PM To: Harsha, Priya Cc: Clemens Ladisch; alsa-devel@alsa-project.org; Lee Revell Subject: Re: [alsa-devel] question on hardware mixing
On Tue, 2008-12-09 at 14:25 +0530, Harsha, Priya wrote:
If I define mixer controls to switch between each substream, I would not be able to handle multiple streams at time....
Check into the ALSA configuration file syntax -- there are number of things you can do there, like define a 'voice' device that uses hooks to set a control setting (snd_kcontrol) when you open a PCM. You can use that control setting to let your driver know if the PCM channel is being used for voice or audio traffic.
Look at how the EMU10K1 handles surround sound audio in /etc/alsa/cards/EMU10K1.conf
I started to do some similar things for sis7019 surround sound, but they've never made it out of my office due to lack of time/testing HW.
I had asked this in my earlier follow up email as well - can I use snd_pcm_t->private_data to communicate if it's a voice or audio I understand this private_data gets copied to substream->private data which will reach the driver... Am I right here?
I can't answer this specifically, but I believe the answer is in the name -- 'private'. This is for the ALSA system to use, you can hang your own data off a substream using snd_pcm_substream_chip(). Besides, how do you plan on setting it in the snd_pcm_t type?
I think that if you set up some controls, use the config file language, and have your audio apps open a 'voice' device, you can get where you want.
Dave
The issue that I am facing with creating a snd_kcontrol is that I am not able to bind that value to a stream. Say I start the application and set the type of that control to voice and open another instance of that application and set the type to audio. There might be a clash and I might get the wrong stream type to the driver. Also, the stream ids passed cannot also be guaranteed to reach the right stream.
-----Original Message----- From: alsa-devel-bounces@alsa-project.org [mailto:alsa-devel-bounces@alsa-project.org] On Behalf Of Harsha, Priya Sent: Thursday, April 09, 2009 1:07 PM To: alsa-devel@alsa-project.org Cc: Takashi Iwai; David Dillow; Lee Revell; Clemens Ladisch Subject: Re: [alsa-devel] question on hardware
Hi ,
I need more help here. I tried looking at the .conf file but I have another requirement here.
Let me put my requirements here. Please suggest me ways to get this done
- When I get a .prepare call in my driver, I need to know the stream type
- When I return from that call, I need to send to the user the locally allocated stream id
This is specific to the sound card/ DSP I am developing the driver for. The application is also proprietary. Is this possible at all? Please suggest me ways to do the same.
Thanks, Harsha
-----Original Message----- From: David Dillow [mailto:dave@thedillows.org] Sent: Tuesday, December 09, 2008 6:14 PM To: Harsha, Priya Cc: Clemens Ladisch; alsa-devel@alsa-project.org; Lee Revell Subject: Re: [alsa-devel] question on hardware mixing
On Tue, 2008-12-09 at 14:25 +0530, Harsha, Priya wrote:
If I define mixer controls to switch between each substream, I would not be able to handle multiple streams at time....
Check into the ALSA configuration file syntax -- there are number of things you can do there, like define a 'voice' device that uses hooks to set a control setting (snd_kcontrol) when you open a PCM. You can use that control setting to let your driver know if the PCM channel is being used for voice or audio traffic.
Look at how the EMU10K1 handles surround sound audio in /etc/alsa/cards/EMU10K1.conf
I started to do some similar things for sis7019 surround sound, but they've never made it out of my office due to lack of time/testing HW.
I had asked this in my earlier follow up email as well - can I use snd_pcm_t->private_data to communicate if it's a voice or audio I understand this private_data gets copied to substream->private data which will reach the driver... Am I right here?
I can't answer this specifically, but I believe the answer is in the name -- 'private'. This is for the ALSA system to use, you can hang your own data off a substream using snd_pcm_substream_chip(). Besides, how do you plan on setting it in the snd_pcm_t type?
I think that if you set up some controls, use the config file language, and have your audio apps open a 'voice' device, you can get where you want.
Dave
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
At Thu, 9 Apr 2009 13:26:50 +0530, Harsha, Priya wrote:
The issue that I am facing with creating a snd_kcontrol is that I am not able to bind that value to a stream.
Why?
Say I start the application and set the type of that control to voice and open another instance of that application and set the type to audio.
Another instance must have a different stream, right? Then it must have a different substream number. In the scenario a la emu10k1, you'll have a control per each substream. So this won't conflict.
There might be a clash and I might get the wrong stream type to the driver. Also, the stream ids passed cannot also be guaranteed to reach the right stream.
The "stream id" you are referring to might be different from what I'm thinking of. Please elaborate your terminology before further questions. It's a bit hard to illustrate your use-case from your descriptions, so far...
thanks,
Takashi
-----Original Message----- From: alsa-devel-bounces@alsa-project.org [mailto:alsa-devel-bounces@alsa-project.org] On Behalf Of Harsha, Priya Sent: Thursday, April 09, 2009 1:07 PM To: alsa-devel@alsa-project.org Cc: Takashi Iwai; David Dillow; Lee Revell; Clemens Ladisch Subject: Re: [alsa-devel] question on hardware
Hi ,
I need more help here. I tried looking at the .conf file but I have another requirement here.
Let me put my requirements here. Please suggest me ways to get this done
- When I get a .prepare call in my driver, I need to know the stream type
- When I return from that call, I need to send to the user the locally allocated stream id
This is specific to the sound card/ DSP I am developing the driver for. The application is also proprietary. Is this possible at all? Please suggest me ways to do the same.
Thanks, Harsha
-----Original Message----- From: David Dillow [mailto:dave@thedillows.org] Sent: Tuesday, December 09, 2008 6:14 PM To: Harsha, Priya Cc: Clemens Ladisch; alsa-devel@alsa-project.org; Lee Revell Subject: Re: [alsa-devel] question on hardware mixing
On Tue, 2008-12-09 at 14:25 +0530, Harsha, Priya wrote:
If I define mixer controls to switch between each substream, I would not be able to handle multiple streams at time....
Check into the ALSA configuration file syntax -- there are number of things you can do there, like define a 'voice' device that uses hooks to set a control setting (snd_kcontrol) when you open a PCM. You can use that control setting to let your driver know if the PCM channel is being used for voice or audio traffic.
Look at how the EMU10K1 handles surround sound audio in /etc/alsa/cards/EMU10K1.conf
I started to do some similar things for sis7019 surround sound, but they've never made it out of my office due to lack of time/testing HW.
I had asked this in my earlier follow up email as well - can I use snd_pcm_t->private_data to communicate if it's a voice or audio I understand this private_data gets copied to substream->private data which will reach the driver... Am I right here?
I can't answer this specifically, but I believe the answer is in the name -- 'private'. This is for the ALSA system to use, you can hang your own data off a substream using snd_pcm_substream_chip(). Besides, how do you plan on setting it in the snd_pcm_t type?
I think that if you set up some controls, use the config file language, and have your audio apps open a 'voice' device, you can get where you want.
Dave
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Harsha, Priya wrote:
If I define mixer controls to switch between each substream,
I wrote "mixer controls to switch between these settings for each substream", i.e., each substream would have its own flag.
can I use snd_pcm_t->private_data to communicate if it's a voice or audio
ALSA does not have a predefined mechanism to set it from userspace. Your driver can initialize it when it is probed, or it can change it when opening the substream.
HTH Clemens
-----Original Message----- From: alsa-devel-bounces@alsa-project.org [mailto:alsa-devel-bounces@alsa-project.org] On Behalf Of Clemens Ladisch Sent: Tuesday, December 09, 2008 7:36 PM To: Harsha, Priya Cc: alsa-devel@alsa-project.org; Lee Revell Subject: Re: [alsa-devel] question on hardware mixing
Harsha, Priya wrote:
If I define mixer controls to switch between each substream,
I wrote "mixer controls to switch between these settings for each substream", i.e., each substream would have its own flag. [Harsha] I am still not comfortable how to do this... I guess EMU10K1 handle this kind of mixer controls for switching... I shall look into this driver to learn more
can I use snd_pcm_t->private_data to communicate if it's a voice or audio
ALSA does not have a predefined mechanism to set it from userspace. Your driver can initialize it when it is probed, or it can change it when opening the substream. [Harsha] Thanks.... so can I assume that when I open a substream, I can set a private_data to communicate to the driver if its voice/music?
HTH Clemens _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
I wrote "mixer controls to switch between these settings for each substream", i.e., each substream would have its own flag.
If I create a mixer control using snd_kcontrol. When two applications in parallel try to create a stream and change the snd_kcontrol, can you help me understand how I would get the stream type stored in each substream as a flag?
Also, when I get a snd_kcontrol's .set function call, I am not sure how to get the substream specific data in that call?
Thanks, Harsha
At Fri, 5 Dec 2008 16:53:42 +0000, Mark Brown wrote:
The following changes since commit 32c8dabc97d436582298ebd0e33af041c69f5a4b: Mark Brown (1): ASoC: Remove obsolete declaration of struct snd_soc_clock_info
are available in the git repository at:
git://opensource.wolfsonmicro.com/linux-2.6-asoc for-tiwai
Thanks, pulled now.
Takashi
Daniel Mack (1): ASoC: tlv320aic3x: control additions and cleanups
Grazvydas Ignotas (1): ASoC: Add support for OMAP3 Pandora
sound/soc/codecs/tlv320aic3x.c | 18 ++- sound/soc/omap/Kconfig | 8 + sound/soc/omap/Makefile | 2 + sound/soc/omap/omap3pandora.c | 311 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 334 insertions(+), 5 deletions(-) create mode 100644 sound/soc/omap/omap3pandora.c
participants (7)
-
Clemens Ladisch
-
David Dillow
-
Harsha, Priya
-
Lee Revell
-
Mark Brown
-
Takashi Iwai
-
Vedran Miletić