[alsa-cvslog] CVS: alsa-kernel/core pcm.c,1.13,1.14 pcm_lib.c,1.12,1.13 pcm_misc.c,1.4,1.5 pcm_nativ
Brought to you by:
perex
From: Jaroslav K. <pe...@us...> - 2002-06-26 02:02:52
|
Update of /cvsroot/alsa/alsa-kernel/core In directory usw-pr-cvs1:/tmp/cvs-serv22842/core Modified Files: pcm.c pcm_lib.c pcm_misc.c pcm_native.c Log Message: Enhanced bitmasks in PCM - added support for more formats by Takashi and me Index: pcm.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/pcm.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- pcm.c 12 Jun 2002 13:04:00 -0000 1.13 +++ pcm.c 26 Jun 2002 02:02:49 -0000 1.14 @@ -184,6 +184,18 @@ FORMAT(MPEG), FORMAT(GSM), FORMAT(SPECIAL), + FORMAT(S24_3LE), + FORMAT(S24_3BE), + FORMAT(U24_3LE), + FORMAT(U24_3BE), + FORMAT(S20_3LE), + FORMAT(S20_3BE), + FORMAT(U20_3LE), + FORMAT(U20_3BE), + FORMAT(S18_3LE), + FORMAT(S18_3BE), + FORMAT(U18_3LE), + FORMAT(U18_3BE), }; char *snd_pcm_subformat_names[] = { Index: pcm_lib.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/pcm_lib.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- pcm_lib.c 23 May 2002 08:20:38 -0000 1.12 +++ pcm_lib.c 26 Jun 2002 02:02:49 -0000 1.13 @@ -813,9 +813,23 @@ unsigned int mask) { snd_pcm_hw_constraints_t *constrs = &runtime->hw_constraints; - unsigned int *maskp = constrs_mask(constrs, var); - *maskp &= mask; - if (*maskp == 0) + snd_mask_t *maskp = constrs_mask(constrs, var); + *maskp->bits &= mask; + memset(maskp->bits + 1, 0, (SNDRV_MASK_MAX-32) / 8); /* clear rest */ + if (*maskp->bits == 0) + return -EINVAL; + return 0; +} + +int snd_pcm_hw_constraint_mask64(snd_pcm_runtime_t *runtime, snd_pcm_hw_param_t var, + u64 mask) +{ + snd_pcm_hw_constraints_t *constrs = &runtime->hw_constraints; + snd_mask_t *maskp = constrs_mask(constrs, var); + maskp->bits[0] &= (unsigned int)mask; + maskp->bits[1] &= (unsigned int)(mask >> 32); + memset(maskp->bits + 2, 0, (SNDRV_MASK_MAX-64) / 8); /* clear rest */ + if (! maskp->bits[0] && ! maskp->bits[1]) return -EINVAL; return 0; } @@ -982,7 +996,9 @@ { unsigned int k; memset(params, 0, sizeof(*params)); - for (k = 0; k <= SNDRV_PCM_HW_PARAM_LAST; k++) + for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++) + _snd_pcm_hw_param_any(params, k); + for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) _snd_pcm_hw_param_any(params, k); params->info = ~0U; } Index: pcm_misc.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/pcm_misc.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- pcm_misc.c 14 Feb 2002 17:40:30 -0000 1.4 +++ pcm_misc.c 26 Jun 2002 02:02:49 -0000 1.5 @@ -41,6 +41,12 @@ case SNDRV_PCM_FORMAT_S24_BE: case SNDRV_PCM_FORMAT_S32_LE: case SNDRV_PCM_FORMAT_S32_BE: + case SNDRV_PCM_FORMAT_S24_3LE: + case SNDRV_PCM_FORMAT_S24_3BE: + case SNDRV_PCM_FORMAT_S20_3LE: + case SNDRV_PCM_FORMAT_S20_3BE: + case SNDRV_PCM_FORMAT_S18_3LE: + case SNDRV_PCM_FORMAT_S18_3BE: return 1; case SNDRV_PCM_FORMAT_U8: case SNDRV_PCM_FORMAT_U16_LE: @@ -49,6 +55,12 @@ case SNDRV_PCM_FORMAT_U24_BE: case SNDRV_PCM_FORMAT_U32_LE: case SNDRV_PCM_FORMAT_U32_BE: + case SNDRV_PCM_FORMAT_U24_3LE: + case SNDRV_PCM_FORMAT_U24_3BE: + case SNDRV_PCM_FORMAT_U20_3LE: + case SNDRV_PCM_FORMAT_U20_3BE: + case SNDRV_PCM_FORMAT_U18_3LE: + case SNDRV_PCM_FORMAT_U18_3BE: return 0; default: return -EINVAL; @@ -82,6 +94,12 @@ case SNDRV_PCM_FORMAT_FLOAT_LE: case SNDRV_PCM_FORMAT_FLOAT64_LE: case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE: + case SNDRV_PCM_FORMAT_S24_3LE: + case SNDRV_PCM_FORMAT_S20_3LE: + case SNDRV_PCM_FORMAT_S18_3LE: + case SNDRV_PCM_FORMAT_U24_3LE: + case SNDRV_PCM_FORMAT_U20_3LE: + case SNDRV_PCM_FORMAT_U18_3LE: return 1; case SNDRV_PCM_FORMAT_S16_BE: case SNDRV_PCM_FORMAT_U16_BE: @@ -92,6 +110,12 @@ case SNDRV_PCM_FORMAT_FLOAT_BE: case SNDRV_PCM_FORMAT_FLOAT64_BE: case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE: + case SNDRV_PCM_FORMAT_S24_3BE: + case SNDRV_PCM_FORMAT_S20_3BE: + case SNDRV_PCM_FORMAT_S18_3BE: + case SNDRV_PCM_FORMAT_U24_3BE: + case SNDRV_PCM_FORMAT_U20_3BE: + case SNDRV_PCM_FORMAT_U18_3BE: return 0; default: return -EINVAL; @@ -128,10 +152,24 @@ case SNDRV_PCM_FORMAT_U16_LE: case SNDRV_PCM_FORMAT_U16_BE: return 16; + case SNDRV_PCM_FORMAT_S18_3LE: + case SNDRV_PCM_FORMAT_S18_3BE: + case SNDRV_PCM_FORMAT_U18_3LE: + case SNDRV_PCM_FORMAT_U18_3BE: + return 18; + case SNDRV_PCM_FORMAT_S20_3LE: + case SNDRV_PCM_FORMAT_S20_3BE: + case SNDRV_PCM_FORMAT_U20_3LE: + case SNDRV_PCM_FORMAT_U20_3BE: + return 20; case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_BE: case SNDRV_PCM_FORMAT_U24_LE: case SNDRV_PCM_FORMAT_U24_BE: + case SNDRV_PCM_FORMAT_S24_3LE: + case SNDRV_PCM_FORMAT_S24_3BE: + case SNDRV_PCM_FORMAT_U24_3LE: + case SNDRV_PCM_FORMAT_U24_3BE: return 24; case SNDRV_PCM_FORMAT_S32_LE: case SNDRV_PCM_FORMAT_S32_BE: @@ -167,6 +205,19 @@ case SNDRV_PCM_FORMAT_U16_LE: case SNDRV_PCM_FORMAT_U16_BE: return 16; + case SNDRV_PCM_FORMAT_S18_3LE: + case SNDRV_PCM_FORMAT_S18_3BE: + case SNDRV_PCM_FORMAT_U18_3LE: + case SNDRV_PCM_FORMAT_U18_3BE: + case SNDRV_PCM_FORMAT_S20_3LE: + case SNDRV_PCM_FORMAT_S20_3BE: + case SNDRV_PCM_FORMAT_U20_3LE: + case SNDRV_PCM_FORMAT_U20_3BE: + case SNDRV_PCM_FORMAT_S24_3LE: + case SNDRV_PCM_FORMAT_S24_3BE: + case SNDRV_PCM_FORMAT_U24_3LE: + case SNDRV_PCM_FORMAT_U24_3BE: + return 24; case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_BE: case SNDRV_PCM_FORMAT_U24_LE: @@ -204,6 +255,19 @@ case SNDRV_PCM_FORMAT_U16_LE: case SNDRV_PCM_FORMAT_U16_BE: return samples * 2; + case SNDRV_PCM_FORMAT_S18_3LE: + case SNDRV_PCM_FORMAT_S18_3BE: + case SNDRV_PCM_FORMAT_U18_3LE: + case SNDRV_PCM_FORMAT_U18_3BE: + case SNDRV_PCM_FORMAT_S20_3LE: + case SNDRV_PCM_FORMAT_S20_3BE: + case SNDRV_PCM_FORMAT_U20_3LE: + case SNDRV_PCM_FORMAT_U20_3BE: + case SNDRV_PCM_FORMAT_S24_3LE: + case SNDRV_PCM_FORMAT_S24_3BE: + case SNDRV_PCM_FORMAT_U24_3LE: + case SNDRV_PCM_FORMAT_U24_3BE: + return samples * 3; case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_BE: case SNDRV_PCM_FORMAT_U24_LE: @@ -243,6 +307,12 @@ case SNDRV_PCM_FORMAT_S24_BE: case SNDRV_PCM_FORMAT_S32_LE: case SNDRV_PCM_FORMAT_S32_BE: + case SNDRV_PCM_FORMAT_S24_3LE: + case SNDRV_PCM_FORMAT_S24_3BE: + case SNDRV_PCM_FORMAT_S20_3LE: + case SNDRV_PCM_FORMAT_S20_3BE: + case SNDRV_PCM_FORMAT_S18_3LE: + case SNDRV_PCM_FORMAT_S18_3BE: return 0; case SNDRV_PCM_FORMAT_U8: return 0x8080808080808080ULL; @@ -273,6 +343,15 @@ case SNDRV_PCM_FORMAT_U32_BE: return 0x8000000080000000ULL; #endif + case SNDRV_PCM_FORMAT_U24_3LE: + case SNDRV_PCM_FORMAT_U24_3BE: + return 0x0000800000800000ULL; + case SNDRV_PCM_FORMAT_U20_3LE: + case SNDRV_PCM_FORMAT_U20_3BE: + return 0x0000080000080000ULL; + case SNDRV_PCM_FORMAT_U18_3LE: + case SNDRV_PCM_FORMAT_U18_3BE: + return 0x0000020000020000ULL; case SNDRV_PCM_FORMAT_FLOAT_LE: { union { @@ -379,20 +458,45 @@ } case 16: { u_int16_t silence = snd_pcm_format_silence_64(format); - while (samples-- > 0) - *((u_int16_t *)data)++ = silence; + if (! silence) + memset(data, 0, samples * 2); + else { + while (samples-- > 0) + *((u_int16_t *)data)++ = silence; + } break; } + case 24: { + u_int32_t silence = snd_pcm_format_silence_64(format); + if (! silence) + memset(data, 0, samples * 3); + else { + /* FIXME: rewrite in the more better way.. */ + int i; + while (samples-- > 0) { + for (i = 0; i < 3; i++) + *((u_int8_t *)data)++ = silence >> (i * 8); + } + } + } case 32: { u_int32_t silence = snd_pcm_format_silence_64(format); - while (samples-- > 0) - *((u_int32_t *)data)++ = silence; + if (! silence) + memset(data, 0, samples * 4); + else { + while (samples-- > 0) + *((u_int32_t *)data)++ = silence; + } break; } case 64: { u_int64_t silence = snd_pcm_format_silence_64(format); - while (samples-- > 0) - *((u_int64_t *)data)++ = silence; + if (! silence) + memset(data, 0, samples * 8); + else { + while (samples-- > 0) + *((u_int64_t *)data)++ = silence; + } break; } default: Index: pcm_native.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/pcm_native.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- pcm_native.c 18 Jun 2002 08:13:33 -0000 1.15 +++ pcm_native.c 26 Jun 2002 02:02:49 -0000 1.16 @@ -32,6 +32,36 @@ #include <sound/pcm_params.h> #include <sound/minors.h> +/* + * Compatibility + */ + +struct sndrv_pcm_hw_params_old { + unsigned int flags; + unsigned int masks[SNDRV_PCM_HW_PARAM_SUBFORMAT - + SNDRV_PCM_HW_PARAM_ACCESS + 1]; + struct sndrv_interval intervals[SNDRV_PCM_HW_PARAM_TICK_TIME - + SNDRV_PCM_HW_PARAM_SAMPLE_BITS + 1]; + unsigned int rmask; + unsigned int cmask; + unsigned int info; + unsigned int msbits; + unsigned int rate_num; + unsigned int rate_den; + sndrv_pcm_uframes_t fifo_size; + unsigned char reserved[64]; +}; + +#define SNDRV_PCM_IOCTL_HW_REFINE_OLD _IOWR('A', 0x10, struct sndrv_pcm_hw_params_old) +#define SNDRV_PCM_IOCTL_HW_PARAMS_OLD _IOWR('A', 0x11, struct sndrv_pcm_hw_params_old) + +static int snd_pcm_hw_refine_old_user(snd_pcm_substream_t * substream, struct sndrv_pcm_hw_params_old * _oparams); +static int snd_pcm_hw_params_old_user(snd_pcm_substream_t * substream, struct sndrv_pcm_hw_params_old * _oparams); + +/* + * + */ + static rwlock_t pcm_link_lock = RW_LOCK_UNLOCKED; static inline mm_segment_t snd_enter_user(void) @@ -52,6 +82,8 @@ __MOD_DEC_USE_COUNT(module); } + + int snd_pcm_info(snd_pcm_substream_t * substream, snd_pcm_info_t *info) { snd_pcm_runtime_t * runtime; @@ -121,7 +153,7 @@ snd_mask_t *m = NULL; snd_pcm_hw_constraints_t *constrs = &substream->runtime->hw_constraints; unsigned int rstamps[constrs->rules_num]; - unsigned int vstamps[SNDRV_PCM_HW_PARAM_LAST + 1]; + unsigned int vstamps[SNDRV_PCM_HW_PARAM_LAST_INTERVAL + 1]; unsigned int stamp = 2; int changed, again; @@ -187,7 +219,7 @@ for (k = 0; k < constrs->rules_num; k++) rstamps[k] = 0; - for (k = 0; k <= SNDRV_PCM_HW_PARAM_LAST; k++) + for (k = 0; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) vstamps[k] = (params->rmask & (1 << k)) ? 1 : 0; do { again = 0; @@ -211,7 +243,7 @@ printk("%s = ", snd_pcm_hw_param_names[r->var]); if (hw_is_mask(r->var)) { m = hw_param_mask(params, r->var); - printk("%x", *m); + printk("%x", *m->bits); } else { i = hw_param_interval(params, r->var); if (i->empty) @@ -228,7 +260,7 @@ if (r->var >= 0) { printk(" -> "); if (hw_is_mask(r->var)) - printk("%x", *m); + printk("%x", *m->bits); else { if (i->empty) printk("empty"); @@ -1369,16 +1401,17 @@ { unsigned int k; snd_interval_t *i = hw_param_interval(params, rule->deps[0]); - unsigned int m = ~0U; - unsigned int *mask = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); + snd_mask_t m; + snd_mask_t *mask = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); + snd_mask_any(&m); for (k = 0; k <= SNDRV_PCM_FORMAT_LAST; ++k) { int bits; - if (!(*mask & (1U << k))) + if (! snd_mask_test(mask, k)) continue; bits = snd_pcm_format_physical_width(k); snd_assert(bits > 0, continue); if ((unsigned)bits < i->min || (unsigned)bits > i->max) - m &= ~(1U << k); + snd_mask_reset(&m, k); } return snd_mask_refine(mask, &m); } @@ -1394,7 +1427,7 @@ t.openmax = 0; for (k = 0; k <= SNDRV_PCM_FORMAT_LAST; ++k) { int bits; - if (!(*hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT) & (1U << k))) + if (! snd_mask_test(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), k)) continue; bits = snd_pcm_format_physical_width(k); snd_assert(bits > 0, continue); @@ -1582,7 +1615,8 @@ err = snd_pcm_hw_constraint_mask(runtime, SNDRV_PCM_HW_PARAM_ACCESS, mask); snd_assert(err >= 0, return -EINVAL); - err = snd_pcm_hw_constraint_mask(runtime, SNDRV_PCM_HW_PARAM_FORMAT, hw->formats); + err = snd_pcm_hw_constraint_mask64(runtime, SNDRV_PCM_HW_PARAM_FORMAT, hw->formats); + //err = snd_pcm_hw_constraint_mask(runtime, SNDRV_PCM_HW_PARAM_FORMAT, hw->formats); snd_assert(err >= 0, return -EINVAL); err = snd_pcm_hw_constraint_mask(runtime, SNDRV_PCM_HW_PARAM_SUBFORMAT, 1 << SNDRV_PCM_SUBFORMAT_STD); @@ -2053,6 +2087,10 @@ return snd_pcm_resume(substream); case SNDRV_PCM_IOCTL_XRUN: return snd_pcm_xrun(substream); + case SNDRV_PCM_IOCTL_HW_REFINE_OLD: + return snd_pcm_hw_refine_old_user(substream, (struct sndrv_pcm_hw_params_old *) arg); + case SNDRV_PCM_IOCTL_HW_PARAMS_OLD: + return snd_pcm_hw_params_old_user(substream, (struct sndrv_pcm_hw_params_old *) arg); } snd_printd("unknown ioctl = 0x%x\n", cmd); return -ENOTTY; @@ -2723,6 +2761,79 @@ if (err < 0) return err; return 0; +} + +/* + * To be removed helpers to keep binary compatibility + */ + +#define __OLD_TO_NEW_MASK(x) ((x&7)|((x&0x07fffff8)<<5)) +#define __NEW_TO_OLD_MASK(x) ((x&7)|((x&0xffffff00)>>5)) + +static void snd_pcm_hw_convert_from_old_params(snd_pcm_hw_params_t *params, struct sndrv_pcm_hw_params_old *oparams) +{ + unsigned int i; + + memset(params, 0, sizeof(*params)); + params->flags = oparams->flags; + for (i = 0; i < sizeof(oparams->masks) / sizeof(unsigned int); i++) + params->masks[i].bits[0] = oparams->masks[i]; + memcpy(params->intervals, oparams->intervals, sizeof(oparams->intervals)); + params->rmask = __OLD_TO_NEW_MASK(oparams->rmask); + params->cmask = __OLD_TO_NEW_MASK(oparams->cmask); + params->info = oparams->info; + params->msbits = oparams->msbits; + params->rate_num = oparams->rate_num; + params->rate_den = oparams->rate_den; + params->fifo_size = oparams->fifo_size; +} + +static void snd_pcm_hw_convert_to_old_params(struct sndrv_pcm_hw_params_old *oparams, snd_pcm_hw_params_t *params) +{ + unsigned int i; + + memset(oparams, 0, sizeof(*oparams)); + oparams->flags = params->flags; + for (i = 0; i < sizeof(oparams->masks) / sizeof(unsigned int); i++) + oparams->masks[i] = params->masks[i].bits[0]; + memcpy(oparams->intervals, params->intervals, sizeof(oparams->intervals)); + oparams->rmask = __NEW_TO_OLD_MASK(params->rmask); + oparams->cmask = __NEW_TO_OLD_MASK(params->cmask); + oparams->info = params->info; + oparams->msbits = params->msbits; + oparams->rate_num = params->rate_num; + oparams->rate_den = params->rate_den; + oparams->fifo_size = params->fifo_size; +} + +static int snd_pcm_hw_refine_old_user(snd_pcm_substream_t * substream, struct sndrv_pcm_hw_params_old * _oparams) +{ + snd_pcm_hw_params_t params; + struct sndrv_pcm_hw_params_old oparams; + int err; + if (copy_from_user(&oparams, _oparams, sizeof(oparams))) + return -EFAULT; + snd_pcm_hw_convert_from_old_params(¶ms, &oparams); + err = snd_pcm_hw_refine(substream, ¶ms); + snd_pcm_hw_convert_to_old_params(&oparams, ¶ms); + if (copy_to_user(_oparams, &oparams, sizeof(oparams))) + return -EFAULT; + return err; +} + +static int snd_pcm_hw_params_old_user(snd_pcm_substream_t * substream, struct sndrv_pcm_hw_params_old * _oparams) +{ + snd_pcm_hw_params_t params; + struct sndrv_pcm_hw_params_old oparams; + int err; + if (copy_from_user(&oparams, _oparams, sizeof(oparams))) + return -EFAULT; + snd_pcm_hw_convert_from_old_params(¶ms, &oparams); + err = snd_pcm_hw_params(substream, ¶ms); + snd_pcm_hw_convert_to_old_params(&oparams, ¶ms); + if (copy_to_user(_oparams, &oparams, sizeof(oparams))) + return -EFAULT; + return err; } /* |