Esempio n. 1
0
static int
ad1816chan_setformat(kobj_t obj, void *data, u_int32_t format)
{
    struct ad1816_chinfo *ch = data;
    struct ad1816_info *ad1816 = ch->parent;
    int fmt = AD1816_U8, reg;

    ad1816_lock(ad1816);
    if (ch->dir == PCMDIR_PLAY) {
        reg = AD1816_PLAY;
        ad1816_write(ad1816, 8, 0x0000);	/* reset base and current counter */
        ad1816_write(ad1816, 9, 0x0000);	/* for playback and capture */
    } else {
        reg = AD1816_CAPT;
        ad1816_write(ad1816, 10, 0x0000);
        ad1816_write(ad1816, 11, 0x0000);
    }
    switch (AFMT_ENCODING(format)) {
    case AFMT_A_LAW:
        fmt = AD1816_ALAW;
        break;

    case AFMT_MU_LAW:
        fmt = AD1816_MULAW;
        break;

    case AFMT_S16_LE:
        fmt = AD1816_S16LE;
        break;

    case AFMT_S16_BE:
        fmt = AD1816_S16BE;
        break;

    case AFMT_U8:
        fmt = AD1816_U8;
        break;
    }
    if (AFMT_CHANNEL(format) > 1) fmt |= AD1816_STEREO;
    io_wr(ad1816, reg, fmt);
    ad1816_unlock(ad1816);
#if 0
    return format;
#else
    return 0;
#endif
}
Esempio n. 2
0
static int
feed_volume_init(struct pcm_feeder *f)
{
	struct feed_volume_info *info;
	struct pcmchan_matrix *m;
	uint32_t i;
	int ret;

	if (f->desc->in != f->desc->out ||
	    AFMT_CHANNEL(f->desc->in) > SND_CHN_MAX)
		return (EINVAL);

	for (i = 0; i < FEEDVOLUME_TAB_SIZE; i++) {
		if (AFMT_ENCODING(f->desc->in) ==
		    feed_volume_info_tab[i].format) {
			info = malloc(sizeof(*info), M_DEVBUF,
			    M_NOWAIT | M_ZERO);
			if (info == NULL)
				return (ENOMEM);

			info->bps = AFMT_BPS(f->desc->in);
			info->channels = AFMT_CHANNEL(f->desc->in);
			info->apply = feed_volume_info_tab[i].apply;
			info->volume_class = SND_VOL_C_PCM;
			info->state = FEEDVOLUME_ENABLE;

			f->data = info;
			m = feeder_matrix_default_channel_map(info->channels);
			if (m == NULL) {
				free(info, M_DEVBUF);
				return (EINVAL);
			}

			ret = feeder_volume_apply_matrix(f, m);
			if (ret != 0)
				free(info, M_DEVBUF);

			return (ret);
		}
	}

	return (EINVAL);
}