diff options
Diffstat (limited to 'services/audioflinger/AudioHardwareInterface.cpp')
| -rw-r--r-- | services/audioflinger/AudioHardwareInterface.cpp | 182 | 
1 files changed, 182 insertions, 0 deletions
| diff --git a/services/audioflinger/AudioHardwareInterface.cpp b/services/audioflinger/AudioHardwareInterface.cpp new file mode 100644 index 000000000000..9a4a7f9d71a5 --- /dev/null +++ b/services/audioflinger/AudioHardwareInterface.cpp @@ -0,0 +1,182 @@ +/* +** +** Copyright 2007, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License");  +** you may not use this file except in compliance with the License.  +** You may obtain a copy of the License at  +** +**     http://www.apache.org/licenses/LICENSE-2.0  +** +** Unless required by applicable law or agreed to in writing, software  +** distributed under the License is distributed on an "AS IS" BASIS,  +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  +** See the License for the specific language governing permissions and  +** limitations under the License. +*/ + +#include <cutils/properties.h> +#include <string.h> +#include <unistd.h> +//#define LOG_NDEBUG 0 + +#define LOG_TAG "AudioHardwareInterface" +#include <utils/Log.h> +#include <utils/String8.h> + +#include "AudioHardwareStub.h" +#include "AudioHardwareGeneric.h" +#ifdef WITH_A2DP +#include "A2dpAudioInterface.h" +#endif + +#ifdef ENABLE_AUDIO_DUMP +#include "AudioDumpInterface.h" +#endif + + +// change to 1 to log routing calls +#define LOG_ROUTING_CALLS 1 + +namespace android { + +#if LOG_ROUTING_CALLS +static const char* routingModeStrings[] = +{ +    "OUT OF RANGE", +    "INVALID", +    "CURRENT", +    "NORMAL", +    "RINGTONE", +    "IN_CALL" +}; + +static const char* routeNone = "NONE"; + +static const char* displayMode(int mode) +{ +    if ((mode < -2) || (mode > 2)) +        return routingModeStrings[0]; +    return routingModeStrings[mode+3]; +} +#endif + +// ---------------------------------------------------------------------------- + +AudioHardwareInterface* AudioHardwareInterface::create() +{ +    /* +     * FIXME: This code needs to instantiate the correct audio device +     * interface. For now - we use compile-time switches. +     */ +    AudioHardwareInterface* hw = 0; +    char value[PROPERTY_VALUE_MAX]; + +#ifdef GENERIC_AUDIO +    hw = new AudioHardwareGeneric(); +#else +    // if running in emulation - use the emulator driver +    if (property_get("ro.kernel.qemu", value, 0)) { +        LOGD("Running in emulation - using generic audio driver"); +        hw = new AudioHardwareGeneric(); +    } +    else { +        LOGV("Creating Vendor Specific AudioHardware"); +        hw = createAudioHardware(); +    } +#endif +    if (hw->initCheck() != NO_ERROR) { +        LOGW("Using stubbed audio hardware. No sound will be produced."); +        delete hw; +        hw = new AudioHardwareStub(); +    } +     +#ifdef WITH_A2DP +    hw = new A2dpAudioInterface(hw); +#endif + +#ifdef ENABLE_AUDIO_DUMP +    // This code adds a record of buffers in a file to write calls made by AudioFlinger. +    // It replaces the current AudioHardwareInterface object by an intermediate one which +    // will record buffers in a file (after sending them to hardware) for testing purpose. +    // This feature is enabled by defining symbol ENABLE_AUDIO_DUMP. +    // The output file is set with setParameters("test_cmd_file_name=<name>"). Pause are not recorded in the file. +    LOGV("opening PCM dump interface"); +    hw = new AudioDumpInterface(hw);    // replace interface +#endif +    return hw; +} + +AudioStreamOut::~AudioStreamOut() +{ +} + +AudioStreamIn::~AudioStreamIn() {} + +AudioHardwareBase::AudioHardwareBase() +{ +    mMode = 0; +} + +status_t AudioHardwareBase::setMode(int mode) +{ +#if LOG_ROUTING_CALLS +    LOGD("setMode(%s)", displayMode(mode)); +#endif +    if ((mode < 0) || (mode >= AudioSystem::NUM_MODES)) +        return BAD_VALUE; +    if (mMode == mode) +        return ALREADY_EXISTS; +    mMode = mode; +    return NO_ERROR; +} + +// default implementation +status_t AudioHardwareBase::setParameters(const String8& keyValuePairs) +{ +    return NO_ERROR; +} + +// default implementation +String8 AudioHardwareBase::getParameters(const String8& keys) +{ +    AudioParameter param = AudioParameter(keys); +    return param.toString(); +} + +// default implementation +size_t AudioHardwareBase::getInputBufferSize(uint32_t sampleRate, int format, int channelCount) +{ +    if (sampleRate != 8000) { +        LOGW("getInputBufferSize bad sampling rate: %d", sampleRate); +        return 0; +    } +    if (format != AudioSystem::PCM_16_BIT) { +        LOGW("getInputBufferSize bad format: %d", format); +        return 0; +    } +    if (channelCount != 1) { +        LOGW("getInputBufferSize bad channel count: %d", channelCount); +        return 0; +    } + +    return 320; +} + +status_t AudioHardwareBase::dumpState(int fd, const Vector<String16>& args) +{ +    const size_t SIZE = 256; +    char buffer[SIZE]; +    String8 result; +    snprintf(buffer, SIZE, "AudioHardwareBase::dumpState\n"); +    result.append(buffer); +    snprintf(buffer, SIZE, "\tmMode: %d\n", mMode); +    result.append(buffer); +    ::write(fd, result.string(), result.size()); +    dump(fd, args);  // Dump the state of the concrete child. +    return NO_ERROR; +} + +// ---------------------------------------------------------------------------- + +}; // namespace android | 
