1*79330504STreehugger Robot /* 2*79330504STreehugger Robot ** 3*79330504STreehugger Robot ** Copyright 2007, The Android Open Source Project 4*79330504STreehugger Robot ** 5*79330504STreehugger Robot ** Licensed under the Apache License, Version 2.0 (the "License"); 6*79330504STreehugger Robot ** you may not use this file except in compliance with the License. 7*79330504STreehugger Robot ** You may obtain a copy of the License at 8*79330504STreehugger Robot ** 9*79330504STreehugger Robot ** http://www.apache.org/licenses/LICENSE-2.0 10*79330504STreehugger Robot ** 11*79330504STreehugger Robot ** Unless required by applicable law or agreed to in writing, software 12*79330504STreehugger Robot ** distributed under the License is distributed on an "AS IS" BASIS, 13*79330504STreehugger Robot ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*79330504STreehugger Robot ** See the License for the specific language governing permissions and 15*79330504STreehugger Robot ** limitations under the License. 16*79330504STreehugger Robot */ 17*79330504STreehugger Robot 18*79330504STreehugger Robot #ifndef ANDROID_AUDIO_HARDWARE_GENERIC_H 19*79330504STreehugger Robot #define ANDROID_AUDIO_HARDWARE_GENERIC_H 20*79330504STreehugger Robot 21*79330504STreehugger Robot #include <stdint.h> 22*79330504STreehugger Robot #include <sys/types.h> 23*79330504STreehugger Robot 24*79330504STreehugger Robot #include <utils/threads.h> 25*79330504STreehugger Robot 26*79330504STreehugger Robot #include <hardware_legacy/AudioSystemLegacy.h> 27*79330504STreehugger Robot #include <hardware_legacy/AudioHardwareBase.h> 28*79330504STreehugger Robot 29*79330504STreehugger Robot namespace android_audio_legacy { 30*79330504STreehugger Robot using android::Mutex; 31*79330504STreehugger Robot using android::AutoMutex; 32*79330504STreehugger Robot 33*79330504STreehugger Robot // ---------------------------------------------------------------------------- 34*79330504STreehugger Robot 35*79330504STreehugger Robot class AudioHardwareGeneric; 36*79330504STreehugger Robot 37*79330504STreehugger Robot class AudioStreamOutGeneric : public AudioStreamOut { 38*79330504STreehugger Robot public: AudioStreamOutGeneric()39*79330504STreehugger Robot AudioStreamOutGeneric() : mAudioHardware(0), mFd(-1) {} 40*79330504STreehugger Robot virtual ~AudioStreamOutGeneric(); 41*79330504STreehugger Robot 42*79330504STreehugger Robot virtual status_t set( 43*79330504STreehugger Robot AudioHardwareGeneric *hw, 44*79330504STreehugger Robot int mFd, 45*79330504STreehugger Robot uint32_t devices, 46*79330504STreehugger Robot int *pFormat, 47*79330504STreehugger Robot uint32_t *pChannels, 48*79330504STreehugger Robot uint32_t *pRate); 49*79330504STreehugger Robot sampleRate()50*79330504STreehugger Robot virtual uint32_t sampleRate() const { return 44100; } bufferSize()51*79330504STreehugger Robot virtual size_t bufferSize() const { return 4096; } channels()52*79330504STreehugger Robot virtual uint32_t channels() const { return AudioSystem::CHANNEL_OUT_STEREO; } format()53*79330504STreehugger Robot virtual int format() const { return AudioSystem::PCM_16_BIT; } latency()54*79330504STreehugger Robot virtual uint32_t latency() const { return 20; } setVolume(float left,float right)55*79330504STreehugger Robot virtual status_t setVolume(float left, float right) { return INVALID_OPERATION; } 56*79330504STreehugger Robot virtual ssize_t write(const void* buffer, size_t bytes); 57*79330504STreehugger Robot virtual status_t standby(); 58*79330504STreehugger Robot virtual status_t dump(int fd, const Vector<String16>& args); 59*79330504STreehugger Robot virtual status_t setParameters(const String8& keyValuePairs); 60*79330504STreehugger Robot virtual String8 getParameters(const String8& keys); 61*79330504STreehugger Robot virtual status_t getRenderPosition(uint32_t *dspFrames); 62*79330504STreehugger Robot 63*79330504STreehugger Robot private: 64*79330504STreehugger Robot AudioHardwareGeneric *mAudioHardware; 65*79330504STreehugger Robot Mutex mLock; 66*79330504STreehugger Robot int mFd; 67*79330504STreehugger Robot uint32_t mDevice; 68*79330504STreehugger Robot }; 69*79330504STreehugger Robot 70*79330504STreehugger Robot class AudioStreamInGeneric : public AudioStreamIn { 71*79330504STreehugger Robot public: AudioStreamInGeneric()72*79330504STreehugger Robot AudioStreamInGeneric() : mAudioHardware(0), mFd(-1) {} 73*79330504STreehugger Robot virtual ~AudioStreamInGeneric(); 74*79330504STreehugger Robot 75*79330504STreehugger Robot virtual status_t set( 76*79330504STreehugger Robot AudioHardwareGeneric *hw, 77*79330504STreehugger Robot int mFd, 78*79330504STreehugger Robot uint32_t devices, 79*79330504STreehugger Robot int *pFormat, 80*79330504STreehugger Robot uint32_t *pChannels, 81*79330504STreehugger Robot uint32_t *pRate, 82*79330504STreehugger Robot AudioSystem::audio_in_acoustics acoustics); 83*79330504STreehugger Robot sampleRate()84*79330504STreehugger Robot virtual uint32_t sampleRate() const { return 8000; } bufferSize()85*79330504STreehugger Robot virtual size_t bufferSize() const { return 320; } channels()86*79330504STreehugger Robot virtual uint32_t channels() const { return AudioSystem::CHANNEL_IN_MONO; } format()87*79330504STreehugger Robot virtual int format() const { return AudioSystem::PCM_16_BIT; } setGain(float gain)88*79330504STreehugger Robot virtual status_t setGain(float gain) { return INVALID_OPERATION; } 89*79330504STreehugger Robot virtual ssize_t read(void* buffer, ssize_t bytes); 90*79330504STreehugger Robot virtual status_t dump(int fd, const Vector<String16>& args); standby()91*79330504STreehugger Robot virtual status_t standby() { return NO_ERROR; } 92*79330504STreehugger Robot virtual status_t setParameters(const String8& keyValuePairs); 93*79330504STreehugger Robot virtual String8 getParameters(const String8& keys); getInputFramesLost()94*79330504STreehugger Robot virtual unsigned int getInputFramesLost() const { return 0; } addAudioEffect(effect_handle_t effect)95*79330504STreehugger Robot virtual status_t addAudioEffect(effect_handle_t effect) { return NO_ERROR; } removeAudioEffect(effect_handle_t effect)96*79330504STreehugger Robot virtual status_t removeAudioEffect(effect_handle_t effect) { return NO_ERROR; } 97*79330504STreehugger Robot 98*79330504STreehugger Robot private: 99*79330504STreehugger Robot AudioHardwareGeneric *mAudioHardware; 100*79330504STreehugger Robot Mutex mLock; 101*79330504STreehugger Robot int mFd; 102*79330504STreehugger Robot uint32_t mDevice; 103*79330504STreehugger Robot }; 104*79330504STreehugger Robot 105*79330504STreehugger Robot 106*79330504STreehugger Robot class AudioHardwareGeneric : public AudioHardwareBase 107*79330504STreehugger Robot { 108*79330504STreehugger Robot public: 109*79330504STreehugger Robot AudioHardwareGeneric(); 110*79330504STreehugger Robot virtual ~AudioHardwareGeneric(); 111*79330504STreehugger Robot virtual status_t initCheck(); 112*79330504STreehugger Robot virtual status_t setVoiceVolume(float volume); 113*79330504STreehugger Robot virtual status_t setMasterVolume(float volume); 114*79330504STreehugger Robot 115*79330504STreehugger Robot // mic mute 116*79330504STreehugger Robot virtual status_t setMicMute(bool state); 117*79330504STreehugger Robot virtual status_t getMicMute(bool* state); 118*79330504STreehugger Robot 119*79330504STreehugger Robot // create I/O streams 120*79330504STreehugger Robot virtual AudioStreamOut* openOutputStream( 121*79330504STreehugger Robot uint32_t devices, 122*79330504STreehugger Robot int *format=0, 123*79330504STreehugger Robot uint32_t *channels=0, 124*79330504STreehugger Robot uint32_t *sampleRate=0, 125*79330504STreehugger Robot status_t *status=0); 126*79330504STreehugger Robot virtual void closeOutputStream(AudioStreamOut* out); 127*79330504STreehugger Robot 128*79330504STreehugger Robot virtual AudioStreamIn* openInputStream( 129*79330504STreehugger Robot uint32_t devices, 130*79330504STreehugger Robot int *format, 131*79330504STreehugger Robot uint32_t *channels, 132*79330504STreehugger Robot uint32_t *sampleRate, 133*79330504STreehugger Robot status_t *status, 134*79330504STreehugger Robot AudioSystem::audio_in_acoustics acoustics); 135*79330504STreehugger Robot virtual void closeInputStream(AudioStreamIn* in); 136*79330504STreehugger Robot 137*79330504STreehugger Robot void closeOutputStream(AudioStreamOutGeneric* out); 138*79330504STreehugger Robot void closeInputStream(AudioStreamInGeneric* in); 139*79330504STreehugger Robot protected: 140*79330504STreehugger Robot virtual status_t dump(int fd, const Vector<String16>& args); 141*79330504STreehugger Robot 142*79330504STreehugger Robot private: 143*79330504STreehugger Robot status_t dumpInternals(int fd, const Vector<String16>& args); 144*79330504STreehugger Robot 145*79330504STreehugger Robot Mutex mLock; 146*79330504STreehugger Robot AudioStreamOutGeneric *mOutput; 147*79330504STreehugger Robot AudioStreamInGeneric *mInput; 148*79330504STreehugger Robot int mFd; 149*79330504STreehugger Robot bool mMicMute; 150*79330504STreehugger Robot }; 151*79330504STreehugger Robot 152*79330504STreehugger Robot // ---------------------------------------------------------------------------- 153*79330504STreehugger Robot 154*79330504STreehugger Robot }; // namespace android 155*79330504STreehugger Robot 156*79330504STreehugger Robot #endif // ANDROID_AUDIO_HARDWARE_GENERIC_H 157