// 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;
}
Example #2
0
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;
}
Example #3
0
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;
    }
}