Home | History | Annotate | Download | only in audio
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #pragma once
     17 
     18 #include <memory>
     19 
     20 #include "common/vsoc/lib/vsoc_audio_message.h"
     21 #include "guest/hals/audio/audio_hal.h"
     22 #include "guest/hals/audio/simulated_buffer.h"
     23 
     24 namespace cvd {
     25 
     26 namespace {
     27 static const int IN_BUFFER_BYTES = 4096;
     28 }
     29 
     30 class GceAudio;
     31 
     32 // Defines static callback functions for generic_stream_in HAL interface.
     33 class GceAudioInputStream : public audio_stream_in {
     34  public:
     35   // These methods are internal to the GCE audio implementation.
     36   // Factory for new input streams.
     37   static int Open(
     38       GceAudio* dev, audio_io_handle_t handle,
     39       audio_devices_t devices, const audio_config& config,
     40       GceAudioInputStream** stream_in);
     41 
     42   // Gets a description of this stream
     43   gce_audio_message GetStreamDescriptor(
     44       uint32_t stream_number, gce_audio_message::message_t event);
     45 
     46   // audio_stream_in implementation. These definitions follow the ones
     47   // in hardware/libhardware/include/hardware/audio.h
     48 
     49   // Returns the sampling rate in Hz - eg. 44100.
     50   uint32_t GetSampleRate() const { return config_.sample_rate; }
     51 
     52   // Sets the sample rate
     53   // no direct calls from JB and later, but called indirectly from
     54   // GceAudio::SetStreamParamters when it finds
     55   // AUDIO_PARAMETER_STREAM_SAMPLING_RATE
     56   int SetSampleRate(uint32_t rate);
     57 
     58   // Returns the size of input/output buffer in bytes for this stream - eg.
     59   // 4800.
     60   // It should be a multiple of the frame size.  See also get_input_buffer_size
     61   size_t GetBufferSize() const {
     62     return IN_BUFFER_BYTES;
     63   }
     64 
     65   // Returns the channel mask -
     66   //   e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
     67   audio_channel_mask_t GetChannels() const {
     68     return config_.channel_mask;
     69   }
     70 
     71   // Returns the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
     72   audio_format_t GetFormat() const {
     73     return config_.format;
     74   }
     75 
     76   // Sets the audio format
     77   // no direct calls from JB and later, but called indirectly from
     78   // GceAudio::SetStreamParamters when it finds
     79   //   AUDIO_PARAMETER_STREAM_FORMAT
     80   int SetFormat(audio_format_t format);
     81 
     82   // Puts the audio hardware input/output into standby mode.
     83   // Driver should exit from standby mode at the next I/O operation.
     84   // Returns 0 on success and <0 on failure.
     85   int Standby() { return 0; }
     86 
     87   // Dumps the state of the audio input/output device
     88   int Dump(int fd) const;
     89 
     90   // Returns the set of device(s) which this stream is connected to
     91   audio_devices_t GetDevice() const {
     92     return device_;
     93   }
     94 
     95   // Sets the device this stream is connected to.
     96   // no direct calls from JB and later, but called indirectly from
     97   // GceAudio::SetStreamParamters when it finds
     98   //   AUDIO_PARAMETER_STREAM_ROUTING for both input and output.
     99   //   AUDIO_PARAMETER_STREAM_INPUT_SOURCE is an additional information used by
    100   //                                       input streams only.
    101   int SetDevice(audio_devices_t device) { device_ = device; return 0; }
    102 
    103   // sets audio stream parameters. The function accepts a list of
    104   // parameter key value pairs in the form: key1=value1;key2=value2;...
    105   //
    106   // Some keys are reserved for standard parameters (See AudioParameter class)
    107   //
    108   // If the implementation does not accept a parameter change while
    109   // the output is active but the parameter is acceptable otherwise, it must
    110   // return -ENOSYS.
    111   // The audio flinger will put the stream in standby and then change the
    112   // parameter value.
    113   // Uses GceAudio::SetStreamParameters
    114 
    115   // Returns a pointer to a heap allocated string. The caller is responsible
    116   // for freeing the memory for it using free().
    117   char* GetParameters(const char* keys) const;
    118 
    119   int AddAudioEffect(effect_handle_t /*effect*/) const {
    120     return 0;
    121   }
    122 
    123   int RemoveAudioEffect(effect_handle_t /*effect*/) const {
    124     return 0;
    125   }
    126 
    127   // Input stream specific methods
    128 
    129   // Sets the input gain for the audio driver. This method is for
    130   // for future use as of M.
    131   int SetGain(float gain) {
    132     gain_ = gain;
    133     return 0;
    134   }
    135 
    136   // Reads audio buffer in from audio driver. Returns number of bytes read, or
    137   // a negative android::status_t. If at least one frame was read prior to the error,
    138   //  read should return that byte count and then return an error in the
    139   // subsequent call.
    140   ssize_t Read(void* buffer, size_t bytes);
    141 
    142   // Return the amount of input frames lost in the audio driver since the
    143   // last call of this function.
    144   // Audio driver is expected to reset the value to 0 and restart counting
    145   // upon returning the current value by this function call.
    146   // Such loss typically occurs when the user space process is blocked
    147   // longer than the capacity of audio driver buffers.
    148   //
    149   // Unit: the number of input audio frames
    150   uint32_t GetInputFramesLost() {
    151     int64_t cur_lost_frames = buffer_model_->GetLostInputItems();
    152     uint32_t rval = cur_lost_frames - reported_lost_frames_;
    153     reported_lost_frames_ = cur_lost_frames;
    154     return rval;
    155   }
    156 
    157  private:
    158   GceAudioInputStream(cvd::GceAudio* dev, audio_devices_t devices,
    159                       const audio_config& config);
    160   std::unique_ptr<SimulatedInputBuffer> buffer_model_;
    161   cvd::GceAudio *dev_;
    162   audio_config config_;
    163   float gain_;
    164   audio_devices_t device_;
    165   size_t frame_size_;
    166   int64_t reported_lost_frames_;
    167 };
    168 
    169 }
    170