static int oss_play (ao_instance_t * _instance, int flags, sample_t * _samples) { oss_instance_t * instance = (oss_instance_t *) _instance; int16_t int16_samples[256*6]; int chans = -1; #ifdef LIBDCA_DOUBLE convert_t samples[256 * 6]; int i; for (i = 0; i < 256 * 6; i++) samples[i] = _samples[i]; #else convert_t * samples = _samples; #endif chans = channels_multi (flags); flags &= DCA_CHANNEL_MASK | DCA_LFE; if (instance->set_params) { int tmp; tmp = chans; if ((ioctl (instance->fd, SNDCTL_DSP_CHANNELS, &tmp) < 0) || (tmp != chans)) { fprintf (stderr, "Can not set number of channels (%i)\n", chans); return 1; } tmp = instance->sample_rate; if ((ioctl (instance->fd, SNDCTL_DSP_SPEED, &tmp) < 0) || (tmp != instance->sample_rate)) { fprintf (stderr, "Can not set sample rate (%i)\n", instance->sample_rate); return 1; } instance->flags = flags; instance->set_params = 0; } else if ((flags == DCA_DOLBY) && (instance->flags == DCA_STEREO)) { fprintf (stderr, "Switching from stereo to dolby surround\n"); instance->flags = DCA_DOLBY; } else if ((flags == DCA_STEREO) && (instance->flags == DCA_DOLBY)) { fprintf (stderr, "Switching from dolby surround to stereo\n"); instance->flags = DCA_STEREO; } else if (flags != instance->flags) return 1; convert2s16_multi (samples, int16_samples, flags); write (instance->fd, int16_samples, 256 * sizeof (int16_t) * chans); return 0; }
static int al_play (ao_instance_t * _instance, int flags, sample_t * _samples) { al_instance_t * instance = (al_instance_t *) _instance; int16_t int16_samples[256*6]; int chans = -1; #ifdef LIBDTS_DOUBLE convert_t samples[256 * 6]; int i; for (i = 0; i < 256 * 6; i++) samples[i] = _samples[i]; #else convert_t * samples = _samples; #endif chans = channels_multi (flags); flags &= DTS_CHANNEL_MASK | DTS_LFE; if (instance->set_params) { ALconfig config; ALpv params[2]; config = alNewConfig (); if (!config) { fprintf (stderr, "alNewConfig failed\n"); return 1; } if (alSetChannels (config, chans)) { fprintf (stderr, "alSetChannels failed\n"); return 1; } if (alSetConfig (instance->port, config)) { fprintf (stderr, "alSetConfig failed\n"); return 1; } alFreeConfig (config); params[0].param = AL_MASTER_CLOCK; params[0].value.i = AL_CRYSTAL_MCLK_TYPE; params[1].param = AL_RATE; params[1].value.ll = alIntToFixed (instance->sample_rate); if (alSetParams (alGetResource (instance->port), params, 2) < 0) { fprintf (stderr, "alSetParams failed\n"); return 1; } instance->flags = flags; instance->set_params = 0; } else if ((flags == DTS_DOLBY) && (instance->flags == DTS_STEREO)) { fprintf (stderr, "Switching from stereo to dolby surround\n"); instance->flags = DTS_DOLBY; } else if ((flags == DTS_STEREO) && (instance->flags == DTS_DOLBY)) { fprintf (stderr, "Switching from dolby surround to stereo\n"); instance->flags = DTS_STEREO; } else if (flags != instance->flags) return 1; convert2s16_multi (samples, int16_samples, flags); alWriteFrames (instance->port, int16_samples, 256); return 0; }