// returns 1 if successful int getAlsaFormatFromFormat(snd_pcm_format_t* alsaFormat, int sampleSizeInBytes, int significantBits, int isSigned, int isBigEndian, int enc) { *alsaFormat = SND_PCM_FORMAT_UNKNOWN; if (enc == 0) { *alsaFormat = snd_pcm_build_linear_format(significantBits, sampleSizeInBytes * 8, isSigned?0:1, isBigEndian?1:0); } else if ((sampleSizeInBytes == 1) && (significantBits == 8)) { if (enc == 1) { // ULAW *alsaFormat = SND_PCM_FORMAT_MU_LAW; } else if (enc == 2) { // ALAW *alsaFormat = SND_PCM_FORMAT_A_LAW; } } return (*alsaFormat == SND_PCM_FORMAT_UNKNOWN)?0:1; }
static int check_linear_format(const snd_pcm_format_mask_t *format_mask, int wid, int sgn, int ed) { int e, s; if (! linear_format_widths[wid - 1]) return SND_PCM_FORMAT_UNKNOWN; for (e = 0; e < 2; e++) { for (s = 0; s < 2; s++) { int pw = ((wid + 7) / 8) * 8; for (; pw <= 32; pw += 8) { snd_pcm_format_t f; f = snd_pcm_build_linear_format(wid, pw, sgn, ed); if (f != SND_PCM_FORMAT_UNKNOWN && snd_pcm_format_mask_test(format_mask, f)) return f; } sgn = !sgn; } ed = !ed; } return SND_PCM_FORMAT_UNKNOWN; }
static gboolean alsasink_parse_spec (GstAlsaSink * alsa, GstRingBufferSpec * spec) { /* Initialize our boolean */ alsa->iec958 = FALSE; switch (spec->type) { case GST_BUFTYPE_LINEAR: GST_DEBUG_OBJECT (alsa, "Linear format : depth=%d, width=%d, sign=%d, bigend=%d", spec->depth, spec->width, spec->sign, spec->bigend); alsa->format = snd_pcm_build_linear_format (spec->depth, spec->width, spec->sign ? 0 : 1, spec->bigend ? 1 : 0); break; case GST_BUFTYPE_FLOAT: switch (spec->format) { case GST_FLOAT32_LE: alsa->format = SND_PCM_FORMAT_FLOAT_LE; break; case GST_FLOAT32_BE: alsa->format = SND_PCM_FORMAT_FLOAT_BE; break; case GST_FLOAT64_LE: alsa->format = SND_PCM_FORMAT_FLOAT64_LE; break; case GST_FLOAT64_BE: alsa->format = SND_PCM_FORMAT_FLOAT64_BE; break; default: goto error; } break; case GST_BUFTYPE_A_LAW: alsa->format = SND_PCM_FORMAT_A_LAW; break; case GST_BUFTYPE_MU_LAW: alsa->format = SND_PCM_FORMAT_MU_LAW; break; case GST_BUFTYPE_AC3: case GST_BUFTYPE_EAC3: case GST_BUFTYPE_DTS: case GST_BUFTYPE_MPEG: alsa->format = SND_PCM_FORMAT_S16_BE; alsa->iec958 = TRUE; break; default: goto error; } alsa->rate = spec->rate; alsa->channels = spec->channels; alsa->buffer_time = spec->buffer_time; alsa->period_time = spec->latency_time; alsa->access = SND_PCM_ACCESS_RW_INTERLEAVED; return TRUE; /* ERRORS */ error: { return FALSE; } }