diff options
-rw-r--r-- | include/media/AudioRecord.h | 13 | ||||
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 63 |
2 files changed, 51 insertions, 25 deletions
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index d956882..38e3d44 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -100,6 +100,19 @@ public: typedef void (*callback_t)(int event, void* user, void *info); + /* Returns the minimum frame count required for the successful creation of + * an AudioRecord object. + * Returned status (from utils/Errors.h) can be: + * - NO_ERROR: successful operation + * - NO_INIT: audio server or audio hardware not initialized + * - BAD_VALUE: unsupported configuration + */ + + static status_t getMinFrameCount(int* frameCount, + uint32_t sampleRate, + int format, + int channelCount); + /* Constructs an uninitialized AudioRecord. No connection with * AudioFlinger takes place. */ diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index a2436ab..a6c515c 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -41,6 +41,38 @@ #define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) namespace android { +// --------------------------------------------------------------------------- + +// static +status_t AudioRecord::getMinFrameCount( + int* frameCount, + uint32_t sampleRate, + int format, + int channelCount) +{ + size_t size = 0; + if (AudioSystem::getInputBufferSize(sampleRate, format, channelCount, &size) + != NO_ERROR) { + LOGE("AudioSystem could not query the input buffer size."); + return NO_INIT; + } + + if (size == 0) { + LOGE("Unsupported configuration: sampleRate %d, format %d, channelCount %d", + sampleRate, format, channelCount); + return BAD_VALUE; + } + + // We double the size of input buffer for ping pong use of record buffer. + size <<= 1; + + if (AudioSystem::isLinearPCM(format)) { + size /= channelCount * (format == AudioSystem::PCM_16_BIT ? 2 : 1); + } + + *frameCount = size; + return NO_ERROR; +} // --------------------------------------------------------------------------- @@ -132,29 +164,11 @@ status_t AudioRecord::set( } // validate framecount - size_t inputBuffSizeInBytes = -1; - if (AudioSystem::getInputBufferSize(sampleRate, format, channelCount, &inputBuffSizeInBytes) - != NO_ERROR) { - LOGE("AudioSystem could not query the input buffer size."); - return NO_INIT; - } - - if (inputBuffSizeInBytes == 0) { - LOGE("Recording parameters are not supported: sampleRate %d, channelCount %d, format %d", - sampleRate, channelCount, format); - return BAD_VALUE; - } - - int frameSizeInBytes = channelCount * (format == AudioSystem::PCM_16_BIT ? 2 : 1); - if (AudioSystem::isLinearPCM(format)) { - frameSizeInBytes = channelCount * (format == AudioSystem::PCM_16_BIT ? sizeof(int16_t) : sizeof(int8_t)); - } else { - frameSizeInBytes = sizeof(int8_t); + int minFrameCount = 0; + status_t status = getMinFrameCount(&minFrameCount, sampleRate, format, channelCount); + if (status != NO_ERROR) { + return status; } - - - // We use 2* size of input buffer for ping pong use of record buffer. - int minFrameCount = 2 * inputBuffSizeInBytes / frameSizeInBytes; LOGV("AudioRecord::set() minFrameCount = %d", minFrameCount); if (frameCount == 0) { @@ -170,9 +184,8 @@ status_t AudioRecord::set( mSessionId = sessionId; // create the IAudioRecord - status_t status = openRecord(sampleRate, format, channelCount, - frameCount, flags, input); - + status = openRecord(sampleRate, format, channelCount, + frameCount, flags, input); if (status != NO_ERROR) { return status; } |