int snd_pcm_format_linear(int format);
int snd_pcm_format_little_endian(int format);
int snd_pcm_format_big_endian(int format);
-int snd_pcm_format_width(int format); /* in bits */
+int snd_pcm_format_width(int format); /* in bits */
+int snd_pcm_format_physical_width(int format); /* in bits */
int snd_pcm_build_linear_format(int width, int unsignd, int big_endian);
ssize_t snd_pcm_format_size(int format, size_t samples);
unsigned char snd_pcm_format_silence(int format);
}
}
+int snd_pcm_format_physical_width(int format)
+{
+ switch (format) {
+ case SND_PCM_SFMT_S8:
+ case SND_PCM_SFMT_U8:
+ return 8;
+ case SND_PCM_SFMT_S16_LE:
+ case SND_PCM_SFMT_S16_BE:
+ case SND_PCM_SFMT_U16_LE:
+ case SND_PCM_SFMT_U16_BE:
+ return 16;
+ case SND_PCM_SFMT_S24_LE:
+ case SND_PCM_SFMT_S24_BE:
+ case SND_PCM_SFMT_U24_LE:
+ case SND_PCM_SFMT_U24_BE:
+ case SND_PCM_SFMT_S32_LE:
+ case SND_PCM_SFMT_S32_BE:
+ case SND_PCM_SFMT_U32_LE:
+ case SND_PCM_SFMT_U32_BE:
+ case SND_PCM_SFMT_FLOAT_LE:
+ case SND_PCM_SFMT_FLOAT_BE:
+ case SND_PCM_SFMT_IEC958_SUBFRAME_LE:
+ case SND_PCM_SFMT_IEC958_SUBFRAME_BE:
+ return 32;
+ case SND_PCM_SFMT_FLOAT64_LE:
+ case SND_PCM_SFMT_FLOAT64_BE:
+ return 64;
+ case SND_PCM_SFMT_MU_LAW:
+ case SND_PCM_SFMT_A_LAW:
+ return 8;
+ case SND_PCM_SFMT_IMA_ADPCM:
+ return 4;
+ default:
+ return -EINVAL;
+ }
+}
+
ssize_t snd_pcm_format_size(int format, size_t samples)
{
if (samples < 0)
plugin->name = name ? strdup(name) : NULL;
if (src_format) {
memcpy(&plugin->src_format, src_format, sizeof(snd_pcm_format_t));
- if ((plugin->src_width = snd_pcm_format_width(src_format->format)) < 0)
+ if ((plugin->src_width = snd_pcm_format_physical_width(src_format->format)) < 0)
return NULL;
}
if (dst_format) {
memcpy(&plugin->dst_format, dst_format, sizeof(snd_pcm_format_t));
- if ((plugin->dst_width = snd_pcm_format_width(dst_format->format)) < 0)
+ if ((plugin->dst_width = snd_pcm_format_physical_width(dst_format->format)) < 0)
return NULL;
}
plugin->handle = handle;
snd_pcm_plugin_voice_t *v;
*voices = NULL;
- if ((width = snd_pcm_format_width(format->format)) < 0)
+ if ((width = snd_pcm_format_physical_width(format->format)) < 0)
return width;
size = format->voices * samples * width;
if ((size % 8) != 0)