1010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten/* 2010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * Copyright (C) 2012 The Android Open Source Project 3010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * 4010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * you may not use this file except in compliance with the License. 6010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * You may obtain a copy of the License at 7010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * 8010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * 10010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * Unless required by applicable law or agreed to in writing, software 11010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * See the License for the specific language governing permissions and 14010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * limitations under the License. 15010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten */ 16010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 17010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten#define LOG_TAG "AudioStreamInSource" 18010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten//#define LOG_NDEBUG 0 19010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 20010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten#include <cutils/compiler.h> 21010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten#include <utils/Log.h> 222dd4bdd715f586d4d30cf90cc6fc2bbfbce60fe0Glenn Kasten#include <media/nbaio/AudioStreamInSource.h> 23010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 24010662326b9c43c703725f933e95e0897f8a6bddGlenn Kastennamespace android { 25010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 26010662326b9c43c703725f933e95e0897f8a6bddGlenn KastenAudioStreamInSource::AudioStreamInSource(audio_stream_in *stream) : 27010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten NBAIO_Source(), 28010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mStream(stream), 29010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mStreamBufferSizeBytes(0), 30010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mFramesOverrun(0), 31010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mOverruns(0) 32010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 33010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten ALOG_ASSERT(stream != NULL); 34010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 35010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 36010662326b9c43c703725f933e95e0897f8a6bddGlenn KastenAudioStreamInSource::~AudioStreamInSource() 37010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 38010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 39010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 40010662326b9c43c703725f933e95e0897f8a6bddGlenn Kastenssize_t AudioStreamInSource::negotiate(const NBAIO_Format offers[], size_t numOffers, 41010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten NBAIO_Format counterOffers[], size_t& numCounterOffers) 42010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 43010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten if (mFormat == Format_Invalid) { 44010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mStreamBufferSizeBytes = mStream->common.get_buffer_size(&mStream->common); 45010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten audio_format_t streamFormat = mStream->common.get_format(&mStream->common); 46010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten if (streamFormat == AUDIO_FORMAT_PCM_16_BIT) { 47010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten uint32_t sampleRate = mStream->common.get_sample_rate(&mStream->common); 48010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten audio_channel_mask_t channelMask = 49010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten (audio_channel_mask_t) mStream->common.get_channels(&mStream->common); 50010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mFormat = Format_from_SR_C(sampleRate, popcount(channelMask)); 51010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mBitShift = Format_frameBitShift(mFormat); 52010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 53010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 54010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return NBAIO_Source::negotiate(offers, numOffers, counterOffers, numCounterOffers); 55010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 56010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 57010662326b9c43c703725f933e95e0897f8a6bddGlenn Kastensize_t AudioStreamInSource::framesOverrun() 58010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 59010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten uint32_t framesOverrun = mStream->get_input_frames_lost(mStream); 60010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten if (framesOverrun > 0) { 61010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mFramesOverrun += framesOverrun; 62010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten // FIXME only increment for contiguous ranges 63010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten ++mOverruns; 64010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 65010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return mFramesOverrun; 66010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 67010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 68010662326b9c43c703725f933e95e0897f8a6bddGlenn Kastenssize_t AudioStreamInSource::read(void *buffer, size_t count) 69010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 70010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten if (CC_UNLIKELY(mFormat == Format_Invalid)) { 71010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return NEGOTIATE; 72010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 73010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten ssize_t bytesRead = mStream->read(mStream, buffer, count << mBitShift); 74010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten if (bytesRead > 0) { 75010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten size_t framesRead = bytesRead >> mBitShift; 76010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mFramesRead += framesRead; 77010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return framesRead; 78010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } else { 79010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return bytesRead; 80010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 81010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 82010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 83010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} // namespace android 84