blob: e9f5d532ece9c87e558d34a69b29036ee96f36ee [file] [log] [blame]
Tim Yaoe8c0d4a2019-11-27 14:47:35 -08001#ifndef AUDIO_CLIENT_H
2#define AUDIO_CLIENT_H
3
4#include <boost/interprocess/managed_shared_memory.hpp>
5#include <cstdlib>
6#include <iomanip>
7#include <unistd.h>
8
9#include <hardware/hardware.h>
10#include <hardware/audio.h>
Tim Yaoaaa3bc52020-12-30 17:40:14 -080011#include <IpcBuffer/IpcBuffer.h>
Tim Yaoe8c0d4a2019-11-27 14:47:35 -080012
13#include <grpc/grpc.h>
14#include <grpcpp/channel.h>
15#include <grpcpp/client_context.h>
16#include <grpcpp/create_channel.h>
17#include <grpcpp/security/credentials.h>
cheng tong7d907882020-09-04 18:53:04 +080018#include "audio_effect_if.h"
Tim Yaoe8c0d4a2019-11-27 14:47:35 -080019#include "audio_service.grpc.pb.h"
20
21using grpc::Channel;
22using grpc::ClientContext;
23using grpc::ClientReader;
24using grpc::ClientReaderWriter;
25using grpc::ClientWriter;
26using grpc::Status;
27using google::protobuf::Empty;
28
29typedef struct audio_stream_client {
30 char name[32];
31 struct audio_stream stream;
32} audio_stream_client_t;
33
34typedef struct audio_stream_out_client {
35 char name[32];
36 struct audio_stream_out stream_out;
37} audio_stream_out_client_t;
38
39typedef struct audio_stream_in_client {
40 char name[32];
41 struct audio_stream_in stream_in;
42} audio_stream_in_client_t;
43
44template< class T, class M >
45static inline constexpr ptrdiff_t offset_of( const M T::*member ) {
46 return reinterpret_cast< ptrdiff_t >( &( reinterpret_cast< T* >( 0 )->*member ) );
47}
48
49template< class T, class M >
50static inline T* container_of( const M *ptr, const M T::*member ) {
51 return reinterpret_cast< T* >( reinterpret_cast< intptr_t >( ptr ) - offset_of( member ) );
52}
53
54inline audio_stream_in_client_t* audio_stream_in_to_client(const audio_stream_in *p)
55{
56 return container_of(p, &audio_stream_in_client::stream_in);
57}
58
59inline audio_stream_out_client_t* audio_stream_out_to_client(const audio_stream_out *p)
60{
61 return container_of(p, &audio_stream_out_client::stream_out);
62}
63
64inline audio_stream_client_t* audio_stream_to_client(const audio_stream *p)
65{
66 return container_of(p, &audio_stream_client::stream);
67}
68
69using namespace audio_service;
70
71class AudioClient {
72 public:
73 AudioClient(std::shared_ptr<Channel> channel)
Tim Yaoaaa3bc52020-12-30 17:40:14 -080074 : stub_(AudioService::NewStub(channel)) {}
Tim Yaoe8c0d4a2019-11-27 14:47:35 -080075
76 // Device methods
77 int Device_common_close(struct hw_device_t* device);
78 int Device_init_check(const struct audio_hw_device *dev);
79 int Device_set_voice_volume(struct audio_hw_device *dev, float volume);
80 int Device_set_master_volume(struct audio_hw_device *dev, float volume);
81 int Device_get_master_volume(struct audio_hw_device *dev, float *volume);
82 int Device_set_mode(struct audio_hw_device *dev, audio_mode_t mode);
83 int Device_set_mic_mute(struct audio_hw_device *dev, bool state);
84 int Device_get_mic_mute(const struct audio_hw_device *dev, bool *state);
85 int Device_set_parameters(struct audio_hw_device *dev, const char *kv_pairs);
86 char * Device_get_parameters(const struct audio_hw_device *dev, const char *keys);
87 size_t Device_get_input_buffer_size(const struct audio_hw_device *dev,
88 const struct audio_config *config);
89 int Device_open_output_stream(struct audio_hw_device *dev,
90 audio_io_handle_t handle,
91 audio_devices_t devices,
92 audio_output_flags_t flags,
93 struct audio_config *config,
94 audio_stream_out_client_t *stream_out,
95 const char *address);
96 void Device_close_output_stream(struct audio_hw_device *dev,
97 struct audio_stream_out* stream_out);
98 int Device_open_input_stream(struct audio_hw_device *dev,
99 audio_io_handle_t handle,
100 audio_devices_t devices,
101 struct audio_config *config,
102 audio_stream_in_client_t *stream_in,
103 audio_input_flags_t flags,
104 const char *address,
105 audio_source_t source);
106 void Device_close_input_stream(struct audio_hw_device *dev,
107 struct audio_stream_in *stream_in);
Tim Yaoab2a3a62020-10-29 15:33:55 -0700108 char * Device_dump(const struct audio_hw_device *dev, int fd);
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800109 int Device_set_master_mute(struct audio_hw_device *dev, bool mute);
110 int Device_get_master_mute(struct audio_hw_device *dev, bool *mute);
111 int Device_create_audio_patch(struct audio_hw_device *dev,
112 unsigned int num_sources,
113 const struct audio_port_config *sources,
114 unsigned int num_sinks,
115 const struct audio_port_config *sinks,
116 audio_patch_handle_t *handle);
117 int Device_release_audio_patch(struct audio_hw_device *dev,
118 audio_patch_handle_t handle);
119 int Device_set_audio_port_config(struct audio_hw_device *dev,
120 const struct audio_port_config *config);
121
122 // stream in methods
123 int stream_in_set_gain(struct audio_stream_in *stream, float gain);
124 ssize_t stream_in_read(struct audio_stream_in *stream, void* buffer,
125 size_t bytes);
126 uint32_t stream_in_get_input_frames_lost(struct audio_stream_in *stream);
127 int stream_in_get_capture_position(const struct audio_stream_in *stream,
128 int64_t *frames, int64_t *time);
129
130 // stream_out methods
131 uint32_t stream_out_get_latency(const struct audio_stream_out *stream);
132 int stream_out_set_volume(struct audio_stream_out *stream, float left, float right);
133 ssize_t stream_out_write(struct audio_stream_out *stream, const void* buffer,
134 size_t bytes);
135 int stream_out_get_render_position(const struct audio_stream_out *stream,
136 uint32_t *dsp_frames);
137 int stream_out_get_next_write_timestamp(const struct audio_stream_out *stream,
138 int64_t *timestamp);
139 int stream_out_pause(struct audio_stream_out* stream);
140 int stream_out_resume(struct audio_stream_out* stream);
141 int stream_out_flush(struct audio_stream_out* stream);
142 int stream_out_get_presentation_position(const struct audio_stream_out *stream,
143 uint64_t *frames, struct timespec *timestamp);
144
145 // stream common methods
146 uint32_t stream_get_sample_rate(const struct audio_stream *stream);
147 size_t stream_get_buffer_size(const struct audio_stream *stream);
148 audio_channel_mask_t stream_get_channels(const struct audio_stream *stream);
149 audio_format_t stream_get_format(const struct audio_stream *stream);
150 int stream_standby(struct audio_stream *stream);
151 int stream_dump(const struct audio_stream *stream, int fd);
152 audio_devices_t stream_get_device(const struct audio_stream *stream);
153 int stream_set_parameters(struct audio_stream *stream, const char *kv_pairs);
154 char * stream_get_parameters(const struct audio_stream *stream,
155 const char *keys);
cheng tong7d907882020-09-04 18:53:04 +0800156 int Effect_set_parameters(aml_audio_effect_type_e type, effect_param_t *param);
157 int Effect_get_parameters(aml_audio_effect_type_e type, effect_param_t *param);
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800158
159 const int kSharedBufferSize = 256 * 1024;
160
161 private:
162 std::string new_stream_name(char *name, size_t size) {
163 int pid = ::getpid();
164 int seq = (stream_seq_++);
165 printf("pid=%d seq=%d\n", pid, seq);
166 snprintf(name, size, "%d-%d", pid, seq);
167 printf("name = %s\n", name);
168 return std::string(name);
169 }
170
171 std::unique_ptr<AudioService::Stub> stub_;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800172 static std::atomic_int stream_seq_;
173};
174
175#endif // AUDIO_CLIENT_H
176