• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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