338 lines
17 KiB
Diff
338 lines
17 KiB
Diff
diff --git a/include/asoundef.h b/include/asoundef.h
|
|
index e780c65..c6c4eec 100644
|
|
--- a/include/asoundef.h
|
|
+++ b/include/asoundef.h
|
|
@@ -69,35 +69,56 @@ extern "C" {
|
|
#define IEC958_AES1_PRO_USERBITS_UDEF (12<<4) /**< user defined application */
|
|
#define IEC958_AES1_CON_CATEGORY 0x7f /**< consumer category */
|
|
#define IEC958_AES1_CON_GENERAL 0x00 /**< general category */
|
|
-#define IEC958_AES1_CON_EXPERIMENTAL 0x40 /**< experimental category */
|
|
-#define IEC958_AES1_CON_SOLIDMEM_MASK 0x0f /**< ??? */
|
|
-#define IEC958_AES1_CON_SOLIDMEM_ID 0x08 /**< ??? */
|
|
-#define IEC958_AES1_CON_BROADCAST1_MASK 0x07 /**< ??? */
|
|
-#define IEC958_AES1_CON_BROADCAST1_ID 0x04 /**< ??? */
|
|
-#define IEC958_AES1_CON_DIGDIGCONV_MASK 0x07 /**< digital<->digital converter mask */
|
|
-#define IEC958_AES1_CON_DIGDIGCONV_ID 0x02 /**< digital<->digital converter id */
|
|
-#define IEC958_AES1_CON_ADC_COPYRIGHT_MASK 0x1f /**< ADC Copyright mask */
|
|
-#define IEC958_AES1_CON_ADC_COPYRIGHT_ID 0x06 /**< ADC Copyright ID */
|
|
-#define IEC958_AES1_CON_ADC_MASK 0x1f /**< ADC Mask */
|
|
-#define IEC958_AES1_CON_ADC_ID 0x16 /**< ADC ID */
|
|
-#define IEC958_AES1_CON_BROADCAST2_MASK 0x0f /**< Broadcast mask */
|
|
-#define IEC958_AES1_CON_BROADCAST2_ID 0x0e /**< Broadcast ID */
|
|
#define IEC958_AES1_CON_LASEROPT_MASK 0x07 /**< Laser-optical mask */
|
|
#define IEC958_AES1_CON_LASEROPT_ID 0x01 /**< Laser-optical ID */
|
|
-#define IEC958_AES1_CON_MUSICAL_MASK 0x07 /**< Musical device mask */
|
|
-#define IEC958_AES1_CON_MUSICAL_ID 0x05 /**< Musical device ID */
|
|
-#define IEC958_AES1_CON_MAGNETIC_MASK 0x07 /**< Magnetic device mask */
|
|
-#define IEC958_AES1_CON_MAGNETIC_ID 0x03 /**< Magnetic device ID */
|
|
#define IEC958_AES1_CON_IEC908_CD (IEC958_AES1_CON_LASEROPT_ID|0x00) /**< IEC958 CD compatible device */
|
|
#define IEC958_AES1_CON_NON_IEC908_CD (IEC958_AES1_CON_LASEROPT_ID|0x08) /**< non-IEC958 CD compatible device */
|
|
+#define IEC958_AES1_CON_MINI_DISC (IEC958_AES1_CON_LASEROPT_ID|0x48) /**< Mini-Disc device */
|
|
+#define IEC958_AES1_CON_DVD (IEC958_AES1_CON_LASEROPT_ID|0x18) /**< DVD device */
|
|
+#define IEC958_AES1_CON_LASTEROPT_OTHER (IEC958_AES1_CON_LASEROPT_ID|0x78) /**< Other laser-optical product */
|
|
+#define IEC958_AES1_CON_DIGDIGCONV_MASK 0x07 /**< digital<->digital converter mask */
|
|
+#define IEC958_AES1_CON_DIGDIGCONV_ID 0x02 /**< digital<->digital converter id */
|
|
#define IEC958_AES1_CON_PCM_CODER (IEC958_AES1_CON_DIGDIGCONV_ID|0x00) /**< PCM coder */
|
|
-#define IEC958_AES1_CON_SAMPLER (IEC958_AES1_CON_DIGDIGCONV_ID|0x20) /**< PCM sampler */
|
|
-#define IEC958_AES1_CON_MIXER (IEC958_AES1_CON_DIGDIGCONV_ID|0x10) /**< Mixer */
|
|
+#define IEC958_AES1_CON_MIXER (IEC958_AES1_CON_DIGDIGCONV_ID|0x10) /**< Digital signal mixer */
|
|
#define IEC958_AES1_CON_RATE_CONVERTER (IEC958_AES1_CON_DIGDIGCONV_ID|0x18) /**< Rate converter */
|
|
-#define IEC958_AES1_CON_SYNTHESIZER (IEC958_AES1_CON_MUSICAL_ID|0x00) /**< Synthesizer */
|
|
-#define IEC958_AES1_CON_MICROPHONE (IEC958_AES1_CON_MUSICAL_ID|0x08) /**< Microphone */
|
|
+#define IEC958_AES1_CON_SAMPLER (IEC958_AES1_CON_DIGDIGCONV_ID|0x20) /**< PCM sampler */
|
|
+#define IEC958_AES1_CON_DSP (IEC958_AES1_CON_DIGDIGCONV_ID|0x28) /**< Digital sound processor */
|
|
+#define IEC958_AES1_CON_DIGDIGCONV_OTHER (IEC958_AES1_CON_DIGDIGCONV_ID|0x78) /**< Other digital<->digital product */
|
|
+#define IEC958_AES1_CON_MAGNETIC_MASK 0x07 /**< Magnetic device mask */
|
|
+#define IEC958_AES1_CON_MAGNETIC_ID 0x03 /**< Magnetic device ID */
|
|
#define IEC958_AES1_CON_DAT (IEC958_AES1_CON_MAGNETIC_ID|0x00) /**< Digital Audio Tape */
|
|
#define IEC958_AES1_CON_VCR (IEC958_AES1_CON_MAGNETIC_ID|0x08) /**< Video recorder */
|
|
+#define IEC958_AES1_CON_DCC (IEC958_AES1_CON_MAGNETIC_ID|0x40) /**< Digital compact cassette */
|
|
+#define IEC958_AES1_CON_MAGNETIC_DISC (IEC958_AES1_CON_MAGNETIC_ID|0x18) /**< Magnetic disc digital audio device */
|
|
+#define IEC958_AES1_CON_MAGNETIC_OTHER (IEC958_AES1_CON_MAGNETIC_ID|0x78) /**< Other magnetic device */
|
|
+#define IEC958_AES1_CON_BROADCAST1_MASK 0x07 /**< Broadcast mask */
|
|
+#define IEC958_AES1_CON_BROADCAST1_ID 0x04 /**< Broadcast ID */
|
|
+#define IEC958_AES1_CON_DAB_JAPAN (IEC958_AES1_CON_BROADCAST1_ID|0x00) /**< Digital audio broadcast (Japan) */
|
|
+#define IEC958_AES1_CON_DAB_EUROPE (IEC958_AES1_CON_BROADCAST1_ID|0x08) /**< Digital audio broadcast (Europe) */
|
|
+#define IEC958_AES1_CON_DAB_USA (IEC958_AES1_CON_BROADCAST1_ID|0x60) /**< Digital audio broadcast (USA) */
|
|
+#define IEC958_AES1_CON_SOFTWARE (IEC958_AES1_CON_BROADCAST1_ID|0x40) /**< Electronic software delivery */
|
|
+#define IEC958_AES1_CON_IEC62105 (IEC958_AES1_CON_BROADCAST1_ID|0x20) /**< Used by another standard (IEC 62105) */
|
|
+#define IEC958_AES1_CON_BROADCAST1_OTHER (IEC958_AES1_CON_BROADCAST1_ID|0x78) /**< Other broadcast product */
|
|
+#define IEC958_AES1_CON_BROADCAST2_MASK 0x0f /**< Broadcast alternative mask */
|
|
+#define IEC958_AES1_CON_BROADCAST2_ID 0x0e /**< Broadcast alternative ID */
|
|
+#define IEC958_AES1_CON_MUSICAL_MASK 0x07 /**< Musical device mask */
|
|
+#define IEC958_AES1_CON_MUSICAL_ID 0x05 /**< Musical device ID */
|
|
+#define IEC958_AES1_CON_SYNTHESIZER (IEC958_AES1_CON_MUSICAL_ID|0x00) /**< Synthesizer */
|
|
+#define IEC958_AES1_CON_MICROPHONE (IEC958_AES1_CON_MUSICAL_ID|0x08) /**< Microphone */
|
|
+#define IEC958_AES1_CON_MUSICAL_OTHER (IEC958_AES1_CON_MUSICAL_ID|0x78) /**< Other musical device */
|
|
+#define IEC958_AES1_CON_ADC_MASK 0x1f /**< ADC Mask */
|
|
+#define IEC958_AES1_CON_ADC_ID 0x06 /**< ADC ID */
|
|
+#define IEC958_AES1_CON_ADC (IEC958_AES1_CON_ADC_ID|0x00) /**< ADC without copyright information */
|
|
+#define IEC958_AES1_CON_ADC_OTHER (IEC958_AES1_CON_ADC_ID|0x60) /**< Other ADC product (with no copyright information) */
|
|
+#define IEC958_AES1_CON_ADC_COPYRIGHT_MASK 0x1f /**< ADC Copyright mask */
|
|
+#define IEC958_AES1_CON_ADC_COPYRIGHT_ID 0x16 /**< ADC Copyright ID */
|
|
+#define IEC958_AES1_CON_ADC_COPYRIGHT (IEC958_AES1_CON_ADC_COPYRIGHT_ID|0x00) /**< ADC with copyright information */
|
|
+#define IEC958_AES1_CON_ADC_COPYRIGHT_OTHER (IEC958_AES1_CON_ADC_COPYRIGHT_ID|0x60) /**< Other ADC with copyright information product */
|
|
+#define IEC958_AES1_CON_SOLIDMEM_MASK 0x0f /**< Solid memory based products mask */
|
|
+#define IEC958_AES1_CON_SOLIDMEM_ID 0x08 /**< Solid memory based products ID */
|
|
+#define IEC958_AES1_CON_SOLIDMEM_DIGITAL_RECORDER_PLAYER (IEC958_AES1_CON_SOLIDMEM_ID|0x00) /**< Digital audio recorder and player using solid state memory */
|
|
+#define IEC958_AES1_CON_SOLIDMEM_OTHER (IEC958_AES1_CON_SOLIDMEM_ID|0x70) /**< Other solid state memory based product */
|
|
+#define IEC958_AES1_CON_EXPERIMENTAL 0x40 /**< experimental category */
|
|
#define IEC958_AES1_CON_ORIGINAL (1<<7) /**< this bits depends on the category code */
|
|
#define IEC958_AES2_PRO_SBITS (7<<0) /**< mask - sample bits */
|
|
#define IEC958_AES2_PRO_SBITS_20 (2<<0) /**< 20-bit - coordination */
|
|
@@ -115,8 +136,16 @@ extern "C" {
|
|
#define IEC958_AES2_CON_CHANNEL_UNSPEC (0<<4) /**< channel number unspecified */
|
|
#define IEC958_AES3_CON_FS (15<<0) /**< mask - sample frequency */
|
|
#define IEC958_AES3_CON_FS_44100 (0<<0) /**< 44.1kHz */
|
|
+#define IEC958_AES3_CON_FS_NOTID (1<<0) /**< sample frequency non indicated */
|
|
#define IEC958_AES3_CON_FS_48000 (2<<0) /**< 48kHz */
|
|
#define IEC958_AES3_CON_FS_32000 (3<<0) /**< 32kHz */
|
|
+#define IEC958_AES3_CON_FS_22050 (4<<0) /**< 22.05kHz */
|
|
+#define IEC958_AES3_CON_FS_24000 (6<<0) /**< 24kHz */
|
|
+#define IEC958_AES3_CON_FS_88200 (8<<0) /**< 88.2kHz */
|
|
+#define IEC958_AES3_CON_FS_768000 (9<<0) /**< 768kHz */
|
|
+#define IEC958_AES3_CON_FS_96000 (10<<0) /**< 96kHz */
|
|
+#define IEC958_AES3_CON_FS_176400 (12<<0) /**< 176.4kHz */
|
|
+#define IEC958_AES3_CON_FS_192000 (14<<0) /**< 192kHz */
|
|
#define IEC958_AES3_CON_CLOCK (3<<4) /**< mask - clock accuracy */
|
|
#define IEC958_AES3_CON_CLOCK_1000PPM (0<<4) /**< 1000 ppm */
|
|
#define IEC958_AES3_CON_CLOCK_50PPM (1<<4) /**< 50 ppm */
|
|
@@ -129,6 +158,26 @@ extern "C" {
|
|
#define IEC958_AES4_CON_WORDLEN_23_19 (4<<1) /**< 23-bit or 19-bit */
|
|
#define IEC958_AES4_CON_WORDLEN_24_20 (5<<1) /**< 24-bit or 20-bit */
|
|
#define IEC958_AES4_CON_WORDLEN_21_17 (6<<1) /**< 21-bit or 17-bit */
|
|
+#define IEC958_AES4_CON_ORIGFS (15<<4) /**< mask - original sample frequency */
|
|
+#define IEC958_AES4_CON_ORIGFS_NOTID (0<<4) /**< original sample frequency not indicated */
|
|
+#define IEC958_AES4_CON_ORIGFS_192000 (1<<4) /**< 192kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_12000 (2<<4) /**< 12kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_176400 (3<<4) /**< 176.4kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_96000 (5<<4) /**< 96kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_8000 (6<<4) /**< 8kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_88200 (7<<4) /**< 88.2kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_16000 (8<<4) /**< 16kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_24000 (9<<4) /**< 24kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_11025 (10<<4) /**< 11.025kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_22050 (11<<4) /**< 22.05kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_32000 (12<<4) /**< 32kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_48000 (13<<4) /**< 48kHz */
|
|
+#define IEC958_AES4_CON_ORIGFS_44100 (15<<4) /**< 44.1kHz */
|
|
+#define IEC958_AES5_CON_CGMSA (3<<0) /**< mask - CGMS-A */
|
|
+#define IEC958_AES5_CON_CGMSA_COPYFREELY (0<<0) /**< copying is permitted without restriction */
|
|
+#define IEC958_AES5_CON_CGMSA_COPYONCE (1<<0) /**< one generation of copies may be made */
|
|
+#define IEC958_AES5_CON_CGMSA_COPYNOMORE (2<<0) /**< condition not be used */
|
|
+#define IEC958_AES5_CON_CGMSA_COPYNEVER (3<<0) /**< no copying is permitted */
|
|
|
|
/** \} */
|
|
|
|
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
|
|
index a884b12..1170963 100644
|
|
--- a/src/pcm/pcm_direct.c
|
|
+++ b/src/pcm/pcm_direct.c
|
|
@@ -1107,7 +1107,7 @@ int snd_pcm_direct_initialize_poll_fd(snd_pcm_direct_t *dmix)
|
|
snd_pcm_info_get_subdevice(info) * 2 + capture);
|
|
ret = snd_timer_open(&dmix->timer, name, SND_TIMER_OPEN_NONBLOCK | SND_TIMER_OPEN_TREAD);
|
|
if (ret < 0) {
|
|
- dmix->tread = 1;
|
|
+ dmix->tread = 0;
|
|
ret = snd_timer_open(&dmix->timer, name, SND_TIMER_OPEN_NONBLOCK);
|
|
if (ret < 0) {
|
|
SNDERR("unable to open timer '%s'", name);
|
|
@@ -1293,7 +1293,7 @@ int snd_pcm_direct_check_interleave(snd_pcm_direct_t *dmix, snd_pcm_t *pcm)
|
|
const snd_pcm_channel_area_t *dst_areas;
|
|
const snd_pcm_channel_area_t *src_areas;
|
|
|
|
- bits = snd_pcm_format_physical_width(dmix->type);
|
|
+ bits = snd_pcm_format_physical_width(pcm->format);
|
|
if ((bits % 8) != 0)
|
|
interleaved = 0;
|
|
channels = dmix->channels;
|
|
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
|
|
index c73a02b..c4f5b4a 100644
|
|
--- a/src/pcm/pcm_plugin.c
|
|
+++ b/src/pcm/pcm_plugin.c
|
|
@@ -203,7 +203,7 @@ static snd_pcm_sframes_t snd_pcm_plugin_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t
|
|
snd_pcm_sframes_t n = snd_pcm_mmap_hw_avail(pcm);
|
|
snd_pcm_sframes_t sframes;
|
|
|
|
- if ((snd_pcm_uframes_t)n > frames)
|
|
+ if ((snd_pcm_uframes_t)n < frames)
|
|
frames = n;
|
|
if (frames == 0)
|
|
return 0;
|
|
@@ -222,7 +222,7 @@ static snd_pcm_sframes_t snd_pcm_plugin_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t
|
|
frames = plugin->client_frames(pcm, sframes);
|
|
snd_pcm_mmap_appl_backward(pcm, (snd_pcm_uframes_t) frames);
|
|
snd_atomic_write_end(&plugin->watom);
|
|
- return n;
|
|
+ return (snd_pcm_sframes_t) frames;
|
|
}
|
|
|
|
static snd_pcm_sframes_t snd_pcm_plugin_forwardable(snd_pcm_t *pcm)
|
|
@@ -234,9 +234,9 @@ static snd_pcm_sframes_t snd_pcm_plugin_forward(snd_pcm_t *pcm, snd_pcm_uframes_
|
|
{
|
|
snd_pcm_plugin_t *plugin = pcm->private_data;
|
|
snd_pcm_sframes_t n = snd_pcm_mmap_avail(pcm);
|
|
- snd_pcm_uframes_t sframes;
|
|
+ snd_pcm_sframes_t sframes;
|
|
|
|
- if ((snd_pcm_uframes_t)n > frames)
|
|
+ if ((snd_pcm_uframes_t)n < frames)
|
|
frames = n;
|
|
if (frames == 0)
|
|
return 0;
|
|
@@ -246,8 +246,8 @@ static snd_pcm_sframes_t snd_pcm_plugin_forward(snd_pcm_t *pcm, snd_pcm_uframes_
|
|
else
|
|
sframes = frames;
|
|
snd_atomic_write_begin(&plugin->watom);
|
|
- sframes = INTERNAL(snd_pcm_forward)(plugin->gen.slave, (snd_pcm_uframes_t) sframes);
|
|
- if ((snd_pcm_sframes_t) sframes < 0) {
|
|
+ sframes = INTERNAL(snd_pcm_forward)(plugin->gen.slave, sframes);
|
|
+ if (sframes < 0) {
|
|
snd_atomic_write_end(&plugin->watom);
|
|
return sframes;
|
|
}
|
|
@@ -255,7 +255,7 @@ static snd_pcm_sframes_t snd_pcm_plugin_forward(snd_pcm_t *pcm, snd_pcm_uframes_
|
|
frames = plugin->client_frames(pcm, sframes);
|
|
snd_pcm_mmap_appl_forward(pcm, (snd_pcm_uframes_t) frames);
|
|
snd_atomic_write_end(&plugin->watom);
|
|
- return n;
|
|
+ return (snd_pcm_sframes_t) frames;
|
|
}
|
|
|
|
static snd_pcm_sframes_t snd_pcm_plugin_write_areas(snd_pcm_t *pcm,
|
|
diff --git a/src/pcm/pcm_softvol.c b/src/pcm/pcm_softvol.c
|
|
index 7af7f40..eee6424 100644
|
|
--- a/src/pcm/pcm_softvol.c
|
|
+++ b/src/pcm/pcm_softvol.c
|
|
@@ -275,9 +275,15 @@ static void softvol_convert_stereo_vol(snd_pcm_softvol_t *svol,
|
|
return;
|
|
}
|
|
|
|
- vol[0] = svol->dB_value[svol->cur_vol[0]];
|
|
- vol[1] = svol->dB_value[svol->cur_vol[1]];
|
|
- vol_c = svol->dB_value[(svol->cur_vol[0] + svol->cur_vol[1]) / 2];
|
|
+ if (svol->max_val == 1) {
|
|
+ vol[0] = svol->cur_vol[0] ? 0xffff : 0;
|
|
+ vol[1] = svol->cur_vol[1] ? 0xffff : 0;
|
|
+ vol_c = vol[0] | vol[1];
|
|
+ } else {
|
|
+ vol[0] = svol->dB_value[svol->cur_vol[0]];
|
|
+ vol[1] = svol->dB_value[svol->cur_vol[1]];
|
|
+ vol_c = svol->dB_value[(svol->cur_vol[0] + svol->cur_vol[1]) / 2];
|
|
+ }
|
|
switch (svol->sformat) {
|
|
case SND_PCM_FORMAT_S16_LE:
|
|
case SND_PCM_FORMAT_S16_BE:
|
|
@@ -325,7 +331,10 @@ static void softvol_convert_mono_vol(snd_pcm_softvol_t *svol,
|
|
return;
|
|
}
|
|
|
|
- vol_scale = svol->dB_value[svol->cur_vol[0]];
|
|
+ if (svol->max_val == 1)
|
|
+ vol_scale = svol->cur_vol[0] ? 0xffff : 0;
|
|
+ else
|
|
+ vol_scale = svol->dB_value[svol->cur_vol[0]];
|
|
switch (svol->sformat) {
|
|
case SND_PCM_FORMAT_S16_LE:
|
|
case SND_PCM_FORMAT_S16_BE:
|
|
@@ -569,9 +578,13 @@ static void snd_pcm_softvol_dump(snd_pcm_t *pcm, snd_output_t *out)
|
|
snd_pcm_softvol_t *svol = pcm->private_data;
|
|
snd_output_printf(out, "Soft volume PCM\n");
|
|
snd_output_printf(out, "Control: %s\n", svol->elem.id.name);
|
|
- snd_output_printf(out, "min_dB: %g\n", svol->min_dB);
|
|
- snd_output_printf(out, "max_dB: %g\n", svol->max_dB);
|
|
- snd_output_printf(out, "resolution: %d\n", svol->max_val + 1);
|
|
+ if (svol->max_val == 1)
|
|
+ snd_output_printf(out, "boolean\n");
|
|
+ else {
|
|
+ snd_output_printf(out, "min_dB: %g\n", svol->min_dB);
|
|
+ snd_output_printf(out, "max_dB: %g\n", svol->max_dB);
|
|
+ snd_output_printf(out, "resolution: %d\n", svol->max_val + 1);
|
|
+ }
|
|
if (pcm->setup) {
|
|
snd_output_printf(out, "Its setup is:\n");
|
|
snd_pcm_dump_setup(pcm, out);
|
|
@@ -596,13 +609,21 @@ static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo, int
|
|
int i;
|
|
unsigned int def_val;
|
|
|
|
- err = snd_ctl_elem_add_integer(svol->ctl, &cinfo->id, count, 0, svol->max_val, 0);
|
|
+ if (svol->max_val == 1)
|
|
+ err = snd_ctl_elem_add_boolean(svol->ctl, &cinfo->id, count);
|
|
+ else
|
|
+ err = snd_ctl_elem_add_integer(svol->ctl, &cinfo->id, count,
|
|
+ 0, svol->max_val, 0);
|
|
if (err < 0)
|
|
return err;
|
|
- add_tlv_info(svol, cinfo);
|
|
- /* set zero dB value as default, or max_val if
|
|
- there is no 0 dB setting */
|
|
- def_val = svol->zero_dB_val ? svol->zero_dB_val : svol->max_val;
|
|
+ if (svol->max_val == 1)
|
|
+ def_val = 1;
|
|
+ else {
|
|
+ add_tlv_info(svol, cinfo);
|
|
+ /* set zero dB value as default, or max_val if
|
|
+ there is no 0 dB setting */
|
|
+ def_val = svol->zero_dB_val ? svol->zero_dB_val : svol->max_val;
|
|
+ }
|
|
for (i = 0; i < count; i++)
|
|
svol->elem.value.integer.value[i] = def_val;
|
|
return snd_ctl_elem_write(svol->ctl, &svol->elem);
|
|
@@ -647,7 +668,7 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
|
|
svol->max_val = resolution - 1;
|
|
svol->min_dB = min_dB;
|
|
svol->max_dB = max_dB;
|
|
- if (svol->max_dB == ZERO_DB)
|
|
+ if (svol->max_val == 1 || svol->max_dB == ZERO_DB)
|
|
svol->zero_dB_val = svol->max_val;
|
|
else if (svol->max_dB < 0)
|
|
svol->zero_dB_val = 0; /* there is no 0 dB setting */
|
|
@@ -671,7 +692,8 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
|
|
/* hardware control exists */
|
|
return 1; /* notify */
|
|
|
|
- } else if (cinfo->type != SND_CTL_ELEM_TYPE_INTEGER ||
|
|
+ } else if ((cinfo->type != SND_CTL_ELEM_TYPE_INTEGER &&
|
|
+ cinfo->type != SND_CTL_ELEM_TYPE_BOOLEAN) ||
|
|
cinfo->count != (unsigned int)cchannels ||
|
|
cinfo->value.integer.min != 0 ||
|
|
cinfo->value.integer.max != resolution - 1) {
|
|
@@ -684,7 +706,7 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
|
|
SNDERR("Cannot add a control");
|
|
return err;
|
|
}
|
|
- } else {
|
|
+ } else if (svol->max_val > 1) {
|
|
/* check TLV availability */
|
|
unsigned int tlv[4];
|
|
err = snd_ctl_elem_tlv_read(svol->ctl, &cinfo->id, tlv, sizeof(tlv));
|
|
@@ -693,6 +715,10 @@ static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
|
|
}
|
|
}
|
|
|
|
+ if (svol->max_val == 1)
|
|
+ return 0;
|
|
+
|
|
+ /* set up dB table */
|
|
if (min_dB == PRESET_MIN_DB && max_dB == ZERO_DB && resolution == PRESET_RESOLUTION)
|
|
svol->dB_value = preset_dB_value;
|
|
else {
|
|
@@ -863,6 +889,7 @@ pcm.name {
|
|
[min_dB REAL] # minimal dB value (default: -51.0)
|
|
[max_dB REAL] # maximal dB value (default: 0.0)
|
|
[resolution INT] # resolution (default: 256)
|
|
+ # resolution = 2 means a mute switch
|
|
}
|
|
\endcode
|
|
|
|
@@ -965,7 +992,7 @@ int _snd_pcm_softvol_open(snd_pcm_t **pcmp, const char *name,
|
|
MAX_DB_UPPER_LIMIT);
|
|
return -EINVAL;
|
|
}
|
|
- if (resolution < 0 || resolution > 1024) {
|
|
+ if (resolution <= 1 || resolution > 1024) {
|
|
SNDERR("Invalid resolution value %d", resolution);
|
|
return -EINVAL;
|
|
}
|