NBAIO_Format Format_from_SR_C(unsigned sampleRate, unsigned channelCount, audio_format_t streamFormat ) { NBAIO_Format format; format = Format_from_SR_C(sampleRate, channelCount); if (streamFormat != AUDIO_FORMAT_PCM_16_BIT) { format |= Format_I32; } return format; }
ssize_t AudioStreamOutSink::negotiate(const NBAIO_Format offers[], size_t numOffers, NBAIO_Format counterOffers[], size_t& numCounterOffers) { if (mFormat == Format_Invalid) { mStreamBufferSizeBytes = mStream->common.get_buffer_size(&mStream->common); audio_format_t streamFormat = mStream->common.get_format(&mStream->common); if (streamFormat == AUDIO_FORMAT_PCM_16_BIT) { uint32_t sampleRate = mStream->common.get_sample_rate(&mStream->common); audio_channel_mask_t channelMask = (audio_channel_mask_t) mStream->common.get_channels(&mStream->common); mFormat = Format_from_SR_C(sampleRate, popcount(channelMask)); mBitShift = Format_frameBitShift(mFormat); } } return NBAIO_Sink::negotiate(offers, numOffers, counterOffers, numCounterOffers); }
static int adev_open_output_stream(struct audio_hw_device *dev, audio_io_handle_t handle, audio_devices_t devices, audio_output_flags_t flags, struct audio_config *config, struct audio_stream_out **stream_out) { ALOGV("adev_open_output_stream()"); struct submix_audio_device *rsxadev = (struct submix_audio_device *)dev; struct submix_stream_out *out; int ret; out = (struct submix_stream_out *)calloc(1, sizeof(struct submix_stream_out)); if (!out) { ret = -ENOMEM; goto err_open; } pthread_mutex_lock(&rsxadev->lock); out->stream.common.get_sample_rate = out_get_sample_rate; out->stream.common.set_sample_rate = out_set_sample_rate; out->stream.common.get_buffer_size = out_get_buffer_size; out->stream.common.get_channels = out_get_channels; out->stream.common.get_format = out_get_format; out->stream.common.set_format = out_set_format; out->stream.common.standby = out_standby; out->stream.common.dump = out_dump; out->stream.common.set_parameters = out_set_parameters; out->stream.common.get_parameters = out_get_parameters; out->stream.common.add_audio_effect = out_add_audio_effect; out->stream.common.remove_audio_effect = out_remove_audio_effect; out->stream.get_latency = out_get_latency; out->stream.set_volume = out_set_volume; out->stream.write = out_write; out->stream.get_render_position = out_get_render_position; out->stream.get_next_write_timestamp = out_get_next_write_timestamp; config->channel_mask = AUDIO_CHANNEL_OUT_STEREO; rsxadev->config.channel_mask = config->channel_mask; if ((config->sample_rate != 48000) || (config->sample_rate != 44100)) { config->sample_rate = DEFAULT_RATE_HZ; } rsxadev->config.rate = config->sample_rate; config->format = AUDIO_FORMAT_PCM_16_BIT; rsxadev->config.format = config->format; rsxadev->config.period_size = 1024; rsxadev->config.period_count = 4; out->dev = rsxadev; *stream_out = &out->stream; // initialize pipe { ALOGV(" initializing pipe"); const NBAIO_Format format = Format_from_SR_C(config->sample_rate, 2); const NBAIO_Format offers[1] = {format}; size_t numCounterOffers = 0; // creating a MonoPipe with optional blocking set to true. MonoPipe* sink = new MonoPipe(MAX_PIPE_DEPTH_IN_FRAMES, format, true/*writeCanBlock*/); ssize_t index = sink->negotiate(offers, 1, NULL, numCounterOffers); ALOG_ASSERT(index == 0); MonoPipeReader* source = new MonoPipeReader(sink); numCounterOffers = 0; index = source->negotiate(offers, 1, NULL, numCounterOffers); ALOG_ASSERT(index == 0); rsxadev->rsxSink = sink; rsxadev->rsxSource = source; } pthread_mutex_unlock(&rsxadev->lock); return 0; err_open: *stream_out = NULL; return ret; }
LibsndfileSink::LibsndfileSink(SNDFILE *sndfile, const SF_INFO &sfinfo) : NBAIO_Sink(Format_from_SR_C(sfinfo.samplerate, sfinfo.channels)), mSndfile(sndfile) { }