1/* 2 * Copyright (C) 2012 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 17#define LOG_TAG "r_submix" 18//#define LOG_NDEBUG 0 19 20#include <errno.h> 21#include <pthread.h> 22#include <stdint.h> 23#include <stdlib.h> 24#include <sys/param.h> 25#include <sys/time.h> 26#include <sys/limits.h> 27#include <unistd.h> 28 29#include <cutils/compiler.h> 30#include <cutils/properties.h> 31#include <cutils/str_parms.h> 32#include <log/log.h> 33#include <utils/String8.h> 34 35#include <hardware/audio.h> 36#include <hardware/hardware.h> 37#include <system/audio.h> 38 39#include <media/AudioParameter.h> 40#include <media/AudioBufferProvider.h> 41#include <media/nbaio/MonoPipe.h> 42#include <media/nbaio/MonoPipeReader.h> 43 44#define LOG_STREAMS_TO_FILES 0 45#if LOG_STREAMS_TO_FILES 46#include <fcntl.h> 47#include <stdio.h> 48#include <sys/stat.h> 49#endif // LOG_STREAMS_TO_FILES 50 51extern "C" { 52 53namespace android { 54 55// Uncomment to enable extremely verbose logging in this module. 56// #define SUBMIX_VERBOSE_LOGGING 57#if defined(SUBMIX_VERBOSE_LOGGING) 58#define SUBMIX_ALOGV(...) ALOGV(__VA_ARGS__) 59#define SUBMIX_ALOGE(...) ALOGE(__VA_ARGS__) 60#else 61#define SUBMIX_ALOGV(...) 62#define SUBMIX_ALOGE(...) 63#endif // SUBMIX_VERBOSE_LOGGING 64 65// NOTE: This value will be rounded up to the nearest power of 2 by MonoPipe(). 66#define DEFAULT_PIPE_SIZE_IN_FRAMES (1024*4) 67// Value used to divide the MonoPipe() buffer into segments that are written to the source and 68// read from the sink. The maximum latency of the device is the size of the MonoPipe's buffer 69// the minimum latency is the MonoPipe buffer size divided by this value. 70#define DEFAULT_PIPE_PERIOD_COUNT 4 71// The duration of MAX_READ_ATTEMPTS * READ_ATTEMPT_SLEEP_MS must be stricly inferior to 72// the duration of a record buffer at the current record sample rate (of the device, not of 73// the recording itself). Here we have: 74// 3 * 5ms = 15ms < 1024 frames * 1000 / 48000 = 21.333ms 75#define MAX_READ_ATTEMPTS 3 76#define READ_ATTEMPT_SLEEP_MS 5 // 5ms between two read attempts when pipe is empty 77#define DEFAULT_SAMPLE_RATE_HZ 48000 // default sample rate 78// See NBAIO_Format frameworks/av/include/media/nbaio/NBAIO.h. 79#define DEFAULT_FORMAT AUDIO_FORMAT_PCM_16_BIT 80// A legacy user of this device does not close the input stream when it shuts down, which 81// results in the application opening a new input stream before closing the old input stream 82// handle it was previously using. Setting this value to 1 allows multiple clients to open 83// multiple input streams from this device. If this option is enabled, each input stream returned 84// is *the same stream* which means that readers will race to read data from these streams. 85#define ENABLE_LEGACY_INPUT_OPEN 1 86// Whether channel conversion (16-bit signed PCM mono->stereo, stereo->mono) is enabled. 87#define ENABLE_CHANNEL_CONVERSION 1 88// Whether resampling is enabled. 89#define ENABLE_RESAMPLING 1 90#if LOG_STREAMS_TO_FILES 91// Folder to save stream log files to. 92#define LOG_STREAM_FOLDER "/data/misc/audioserver" 93// Log filenames for input and output streams. 94#define LOG_STREAM_OUT_FILENAME LOG_STREAM_FOLDER "/r_submix_out.raw" 95#define LOG_STREAM_IN_FILENAME LOG_STREAM_FOLDER "/r_submix_in.raw" 96// File permissions for stream log files. 97#define LOG_STREAM_FILE_PERMISSIONS (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) 98#endif // LOG_STREAMS_TO_FILES 99// limit for number of read error log entries to avoid spamming the logs 100#define MAX_READ_ERROR_LOGS 5 101 102// Common limits macros. 103#ifndef min 104#define min(a, b) ((a) < (b) ? (a) : (b)) 105#endif // min 106#ifndef max 107#define max(a, b) ((a) > (b) ? (a) : (b)) 108#endif // max 109 110// Set *result_variable_ptr to true if value_to_find is present in the array array_to_search, 111// otherwise set *result_variable_ptr to false. 112#define SUBMIX_VALUE_IN_SET(value_to_find, array_to_search, result_variable_ptr) \ 113 { \ 114 size_t i; \ 115 *(result_variable_ptr) = false; \ 116 for (i = 0; i < sizeof(array_to_search) / sizeof((array_to_search)[0]); i++) { \ 117 if ((value_to_find) == (array_to_search)[i]) { \ 118 *(result_variable_ptr) = true; \ 119 break; \ 120 } \ 121 } \ 122 } 123 124// Configuration of the submix pipe. 125struct submix_config { 126 // Channel mask field in this data structure is set to either input_channel_mask or 127 // output_channel_mask depending upon the last stream to be opened on this device. 128 struct audio_config common; 129 // Input stream and output stream channel masks. This is required since input and output 130 // channel bitfields are not equivalent. 131 audio_channel_mask_t input_channel_mask; 132 audio_channel_mask_t output_channel_mask; 133#if ENABLE_RESAMPLING 134 // Input stream and output stream sample rates. 135 uint32_t input_sample_rate; 136 uint32_t output_sample_rate; 137#endif // ENABLE_RESAMPLING 138 size_t pipe_frame_size; // Number of bytes in each audio frame in the pipe. 139 size_t buffer_size_frames; // Size of the audio pipe in frames. 140 // Maximum number of frames buffered by the input and output streams. 141 size_t buffer_period_size_frames; 142}; 143 144#define MAX_ROUTES 10 145typedef struct route_config { 146 struct submix_config config; 147 char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; 148 // Pipe variables: they handle the ring buffer that "pipes" audio: 149 // - from the submix virtual audio output == what needs to be played 150 // remotely, seen as an output for AudioFlinger 151 // - to the virtual audio source == what is captured by the component 152 // which "records" the submix / virtual audio source, and handles it as needed. 153 // A usecase example is one where the component capturing the audio is then sending it over 154 // Wifi for presentation on a remote Wifi Display device (e.g. a dongle attached to a TV, or a 155 // TV with Wifi Display capabilities), or to a wireless audio player. 156 sp<MonoPipe> rsxSink; 157 sp<MonoPipeReader> rsxSource; 158 // Pointers to the current input and output stream instances. rsxSink and rsxSource are 159 // destroyed if both and input and output streams are destroyed. 160 struct submix_stream_out *output; 161 struct submix_stream_in *input; 162#if ENABLE_RESAMPLING 163 // Buffer used as temporary storage for resampled data prior to returning data to the output 164 // stream. 165 int16_t resampler_buffer[DEFAULT_PIPE_SIZE_IN_FRAMES]; 166#endif // ENABLE_RESAMPLING 167} route_config_t; 168 169struct submix_audio_device { 170 struct audio_hw_device device; 171 route_config_t routes[MAX_ROUTES]; 172 // Device lock, also used to protect access to submix_audio_device from the input and output 173 // streams. 174 pthread_mutex_t lock; 175}; 176 177struct submix_stream_out { 178 struct audio_stream_out stream; 179 struct submix_audio_device *dev; 180 int route_handle; 181 bool output_standby; 182 uint64_t frames_written; 183 uint64_t frames_written_since_standby; 184#if LOG_STREAMS_TO_FILES 185 int log_fd; 186#endif // LOG_STREAMS_TO_FILES 187}; 188 189struct submix_stream_in { 190 struct audio_stream_in stream; 191 struct submix_audio_device *dev; 192 int route_handle; 193 bool input_standby; 194 bool output_standby_rec_thr; // output standby state as seen from record thread 195 // wall clock when recording starts 196 struct timespec record_start_time; 197 // how many frames have been requested to be read 198 uint64_t read_counter_frames; 199 200#if ENABLE_LEGACY_INPUT_OPEN 201 // Number of references to this input stream. 202 volatile int32_t ref_count; 203#endif // ENABLE_LEGACY_INPUT_OPEN 204#if LOG_STREAMS_TO_FILES 205 int log_fd; 206#endif // LOG_STREAMS_TO_FILES 207 208 volatile uint16_t read_error_count; 209}; 210 211// Determine whether the specified sample rate is supported by the submix module. 212static bool sample_rate_supported(const uint32_t sample_rate) 213{ 214 // Set of sample rates supported by Format_from_SR_C() frameworks/av/media/libnbaio/NAIO.cpp. 215 static const unsigned int supported_sample_rates[] = { 216 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 217 }; 218 bool return_value; 219 SUBMIX_VALUE_IN_SET(sample_rate, supported_sample_rates, &return_value); 220 return return_value; 221} 222 223// Determine whether the specified sample rate is supported, if it is return the specified sample 224// rate, otherwise return the default sample rate for the submix module. 225static uint32_t get_supported_sample_rate(uint32_t sample_rate) 226{ 227 return sample_rate_supported(sample_rate) ? sample_rate : DEFAULT_SAMPLE_RATE_HZ; 228} 229 230// Determine whether the specified channel in mask is supported by the submix module. 231static bool channel_in_mask_supported(const audio_channel_mask_t channel_in_mask) 232{ 233 // Set of channel in masks supported by Format_from_SR_C() 234 // frameworks/av/media/libnbaio/NAIO.cpp. 235 static const audio_channel_mask_t supported_channel_in_masks[] = { 236 AUDIO_CHANNEL_IN_MONO, AUDIO_CHANNEL_IN_STEREO, 237 }; 238 bool return_value; 239 SUBMIX_VALUE_IN_SET(channel_in_mask, supported_channel_in_masks, &return_value); 240 return return_value; 241} 242 243// Determine whether the specified channel in mask is supported, if it is return the specified 244// channel in mask, otherwise return the default channel in mask for the submix module. 245static audio_channel_mask_t get_supported_channel_in_mask( 246 const audio_channel_mask_t channel_in_mask) 247{ 248 return channel_in_mask_supported(channel_in_mask) ? channel_in_mask : 249 static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_IN_STEREO); 250} 251 252// Determine whether the specified channel out mask is supported by the submix module. 253static bool channel_out_mask_supported(const audio_channel_mask_t channel_out_mask) 254{ 255 // Set of channel out masks supported by Format_from_SR_C() 256 // frameworks/av/media/libnbaio/NAIO.cpp. 257 static const audio_channel_mask_t supported_channel_out_masks[] = { 258 AUDIO_CHANNEL_OUT_MONO, AUDIO_CHANNEL_OUT_STEREO, 259 }; 260 bool return_value; 261 SUBMIX_VALUE_IN_SET(channel_out_mask, supported_channel_out_masks, &return_value); 262 return return_value; 263} 264 265// Determine whether the specified channel out mask is supported, if it is return the specified 266// channel out mask, otherwise return the default channel out mask for the submix module. 267static audio_channel_mask_t get_supported_channel_out_mask( 268 const audio_channel_mask_t channel_out_mask) 269{ 270 return channel_out_mask_supported(channel_out_mask) ? channel_out_mask : 271 static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_OUT_STEREO); 272} 273 274// Get a pointer to submix_stream_out given an audio_stream_out that is embedded within the 275// structure. 276static struct submix_stream_out * audio_stream_out_get_submix_stream_out( 277 struct audio_stream_out * const stream) 278{ 279 ALOG_ASSERT(stream); 280 return reinterpret_cast<struct submix_stream_out *>(reinterpret_cast<uint8_t *>(stream) - 281 offsetof(struct submix_stream_out, stream)); 282} 283 284// Get a pointer to submix_stream_out given an audio_stream that is embedded within the structure. 285static struct submix_stream_out * audio_stream_get_submix_stream_out( 286 struct audio_stream * const stream) 287{ 288 ALOG_ASSERT(stream); 289 return audio_stream_out_get_submix_stream_out( 290 reinterpret_cast<struct audio_stream_out *>(stream)); 291} 292 293// Get a pointer to submix_stream_in given an audio_stream_in that is embedded within the 294// structure. 295static struct submix_stream_in * audio_stream_in_get_submix_stream_in( 296 struct audio_stream_in * const stream) 297{ 298 ALOG_ASSERT(stream); 299 return reinterpret_cast<struct submix_stream_in *>(reinterpret_cast<uint8_t *>(stream) - 300 offsetof(struct submix_stream_in, stream)); 301} 302 303// Get a pointer to submix_stream_in given an audio_stream that is embedded within the structure. 304static struct submix_stream_in * audio_stream_get_submix_stream_in( 305 struct audio_stream * const stream) 306{ 307 ALOG_ASSERT(stream); 308 return audio_stream_in_get_submix_stream_in( 309 reinterpret_cast<struct audio_stream_in *>(stream)); 310} 311 312// Get a pointer to submix_audio_device given a pointer to an audio_device that is embedded within 313// the structure. 314static struct submix_audio_device * audio_hw_device_get_submix_audio_device( 315 struct audio_hw_device *device) 316{ 317 ALOG_ASSERT(device); 318 return reinterpret_cast<struct submix_audio_device *>(reinterpret_cast<uint8_t *>(device) - 319 offsetof(struct submix_audio_device, device)); 320} 321 322// Compare an audio_config with input channel mask and an audio_config with output channel mask 323// returning false if they do *not* match, true otherwise. 324static bool audio_config_compare(const audio_config * const input_config, 325 const audio_config * const output_config) 326{ 327#if !ENABLE_CHANNEL_CONVERSION 328 const uint32_t input_channels = audio_channel_count_from_in_mask(input_config->channel_mask); 329 const uint32_t output_channels = audio_channel_count_from_out_mask(output_config->channel_mask); 330 if (input_channels != output_channels) { 331 ALOGE("audio_config_compare() channel count mismatch input=%d vs. output=%d", 332 input_channels, output_channels); 333 return false; 334 } 335#endif // !ENABLE_CHANNEL_CONVERSION 336#if ENABLE_RESAMPLING 337 if (input_config->sample_rate != output_config->sample_rate && 338 audio_channel_count_from_in_mask(input_config->channel_mask) != 1) { 339#else 340 if (input_config->sample_rate != output_config->sample_rate) { 341#endif // ENABLE_RESAMPLING 342 ALOGE("audio_config_compare() sample rate mismatch %ul vs. %ul", 343 input_config->sample_rate, output_config->sample_rate); 344 return false; 345 } 346 if (input_config->format != output_config->format) { 347 ALOGE("audio_config_compare() format mismatch %x vs. %x", 348 input_config->format, output_config->format); 349 return false; 350 } 351 // This purposely ignores offload_info as it's not required for the submix device. 352 return true; 353} 354 355// If one doesn't exist, create a pipe for the submix audio device rsxadev of size 356// buffer_size_frames and optionally associate "in" or "out" with the submix audio device. 357// Must be called with lock held on the submix_audio_device 358static void submix_audio_device_create_pipe_l(struct submix_audio_device * const rsxadev, 359 const struct audio_config * const config, 360 const size_t buffer_size_frames, 361 const uint32_t buffer_period_count, 362 struct submix_stream_in * const in, 363 struct submix_stream_out * const out, 364 const char *address, 365 int route_idx) 366{ 367 ALOG_ASSERT(in || out); 368 ALOG_ASSERT(route_idx > -1); 369 ALOG_ASSERT(route_idx < MAX_ROUTES); 370 ALOGD("submix_audio_device_create_pipe_l(addr=%s, idx=%d)", address, route_idx); 371 372 // Save a reference to the specified input or output stream and the associated channel 373 // mask. 374 if (in) { 375 in->route_handle = route_idx; 376 rsxadev->routes[route_idx].input = in; 377 rsxadev->routes[route_idx].config.input_channel_mask = config->channel_mask; 378#if ENABLE_RESAMPLING 379 rsxadev->routes[route_idx].config.input_sample_rate = config->sample_rate; 380 // If the output isn't configured yet, set the output sample rate to the maximum supported 381 // sample rate such that the smallest possible input buffer is created, and put a default 382 // value for channel count 383 if (!rsxadev->routes[route_idx].output) { 384 rsxadev->routes[route_idx].config.output_sample_rate = 48000; 385 rsxadev->routes[route_idx].config.output_channel_mask = AUDIO_CHANNEL_OUT_STEREO; 386 } 387#endif // ENABLE_RESAMPLING 388 } 389 if (out) { 390 out->route_handle = route_idx; 391 rsxadev->routes[route_idx].output = out; 392 rsxadev->routes[route_idx].config.output_channel_mask = config->channel_mask; 393#if ENABLE_RESAMPLING 394 rsxadev->routes[route_idx].config.output_sample_rate = config->sample_rate; 395#endif // ENABLE_RESAMPLING 396 } 397 // Save the address 398 strncpy(rsxadev->routes[route_idx].address, address, AUDIO_DEVICE_MAX_ADDRESS_LEN); 399 ALOGD(" now using address %s for route %d", rsxadev->routes[route_idx].address, route_idx); 400 // If a pipe isn't associated with the device, create one. 401 if (rsxadev->routes[route_idx].rsxSink == NULL || rsxadev->routes[route_idx].rsxSource == NULL) 402 { 403 struct submix_config * const device_config = &rsxadev->routes[route_idx].config; 404 uint32_t channel_count; 405 if (out) 406 channel_count = audio_channel_count_from_out_mask(config->channel_mask); 407 else 408 channel_count = audio_channel_count_from_in_mask(config->channel_mask); 409#if ENABLE_CHANNEL_CONVERSION 410 // If channel conversion is enabled, allocate enough space for the maximum number of 411 // possible channels stored in the pipe for the situation when the number of channels in 412 // the output stream don't match the number in the input stream. 413 const uint32_t pipe_channel_count = max(channel_count, 2); 414#else 415 const uint32_t pipe_channel_count = channel_count; 416#endif // ENABLE_CHANNEL_CONVERSION 417 const NBAIO_Format format = Format_from_SR_C(config->sample_rate, pipe_channel_count, 418 config->format); 419 const NBAIO_Format offers[1] = {format}; 420 size_t numCounterOffers = 0; 421 // Create a MonoPipe with optional blocking set to true. 422 MonoPipe* sink = new MonoPipe(buffer_size_frames, format, true /*writeCanBlock*/); 423 // Negotiation between the source and sink cannot fail as the device open operation 424 // creates both ends of the pipe using the same audio format. 425 ssize_t index = sink->negotiate(offers, 1, NULL, numCounterOffers); 426 ALOG_ASSERT(index == 0); 427 MonoPipeReader* source = new MonoPipeReader(sink); 428 numCounterOffers = 0; 429 index = source->negotiate(offers, 1, NULL, numCounterOffers); 430 ALOG_ASSERT(index == 0); 431 ALOGV("submix_audio_device_create_pipe_l(): created pipe"); 432 433 // Save references to the source and sink. 434 ALOG_ASSERT(rsxadev->routes[route_idx].rsxSink == NULL); 435 ALOG_ASSERT(rsxadev->routes[route_idx].rsxSource == NULL); 436 rsxadev->routes[route_idx].rsxSink = sink; 437 rsxadev->routes[route_idx].rsxSource = source; 438 // Store the sanitized audio format in the device so that it's possible to determine 439 // the format of the pipe source when opening the input device. 440 memcpy(&device_config->common, config, sizeof(device_config->common)); 441 device_config->buffer_size_frames = sink->maxFrames(); 442 device_config->buffer_period_size_frames = device_config->buffer_size_frames / 443 buffer_period_count; 444 if (in) device_config->pipe_frame_size = audio_stream_in_frame_size(&in->stream); 445 if (out) device_config->pipe_frame_size = audio_stream_out_frame_size(&out->stream); 446#if ENABLE_CHANNEL_CONVERSION 447 // Calculate the pipe frame size based upon the number of channels. 448 device_config->pipe_frame_size = (device_config->pipe_frame_size * pipe_channel_count) / 449 channel_count; 450#endif // ENABLE_CHANNEL_CONVERSION 451 SUBMIX_ALOGV("submix_audio_device_create_pipe_l(): pipe frame size %zd, pipe size %zd, " 452 "period size %zd", device_config->pipe_frame_size, 453 device_config->buffer_size_frames, device_config->buffer_period_size_frames); 454 } 455} 456 457// Release references to the sink and source. Input and output threads may maintain references 458// to these objects via StrongPointer (sp<MonoPipe> and sp<MonoPipeReader>) which they can use 459// before they shutdown. 460// Must be called with lock held on the submix_audio_device 461static void submix_audio_device_release_pipe_l(struct submix_audio_device * const rsxadev, 462 int route_idx) 463{ 464 ALOG_ASSERT(route_idx > -1); 465 ALOG_ASSERT(route_idx < MAX_ROUTES); 466 ALOGD("submix_audio_device_release_pipe_l(idx=%d) addr=%s", route_idx, 467 rsxadev->routes[route_idx].address); 468 if (rsxadev->routes[route_idx].rsxSink != 0) { 469 rsxadev->routes[route_idx].rsxSink.clear(); 470 } 471 if (rsxadev->routes[route_idx].rsxSource != 0) { 472 rsxadev->routes[route_idx].rsxSource.clear(); 473 } 474 memset(rsxadev->routes[route_idx].address, 0, AUDIO_DEVICE_MAX_ADDRESS_LEN); 475#ifdef ENABLE_RESAMPLING 476 memset(rsxadev->routes[route_idx].resampler_buffer, 0, 477 sizeof(int16_t) * DEFAULT_PIPE_SIZE_IN_FRAMES); 478#endif 479} 480 481// Remove references to the specified input and output streams. When the device no longer 482// references input and output streams destroy the associated pipe. 483// Must be called with lock held on the submix_audio_device 484static void submix_audio_device_destroy_pipe_l(struct submix_audio_device * const rsxadev, 485 const struct submix_stream_in * const in, 486 const struct submix_stream_out * const out) 487{ 488 ALOGV("submix_audio_device_destroy_pipe_l()"); 489 int route_idx = -1; 490 if (in != NULL) { 491#if ENABLE_LEGACY_INPUT_OPEN 492 const_cast<struct submix_stream_in*>(in)->ref_count--; 493 route_idx = in->route_handle; 494 ALOG_ASSERT(rsxadev->routes[route_idx].input == in); 495 if (in->ref_count == 0) { 496 rsxadev->routes[route_idx].input = NULL; 497 } 498 ALOGV("submix_audio_device_destroy_pipe_l(): input ref_count %d", in->ref_count); 499#else 500 rsxadev->input = NULL; 501#endif // ENABLE_LEGACY_INPUT_OPEN 502 } 503 if (out != NULL) { 504 route_idx = out->route_handle; 505 ALOG_ASSERT(rsxadev->routes[route_idx].output == out); 506 rsxadev->routes[route_idx].output = NULL; 507 } 508 if (route_idx != -1 && 509 rsxadev->routes[route_idx].input == NULL && rsxadev->routes[route_idx].output == NULL) { 510 submix_audio_device_release_pipe_l(rsxadev, route_idx); 511 ALOGD("submix_audio_device_destroy_pipe_l(): pipe destroyed"); 512 } 513} 514 515// Sanitize the user specified audio config for a submix input / output stream. 516static void submix_sanitize_config(struct audio_config * const config, const bool is_input_format) 517{ 518 config->channel_mask = is_input_format ? get_supported_channel_in_mask(config->channel_mask) : 519 get_supported_channel_out_mask(config->channel_mask); 520 config->sample_rate = get_supported_sample_rate(config->sample_rate); 521 config->format = DEFAULT_FORMAT; 522} 523 524// Verify a submix input or output stream can be opened. 525// Must be called with lock held on the submix_audio_device 526static bool submix_open_validate_l(const struct submix_audio_device * const rsxadev, 527 int route_idx, 528 const struct audio_config * const config, 529 const bool opening_input) 530{ 531 bool input_open; 532 bool output_open; 533 audio_config pipe_config; 534 535 // Query the device for the current audio config and whether input and output streams are open. 536 output_open = rsxadev->routes[route_idx].output != NULL; 537 input_open = rsxadev->routes[route_idx].input != NULL; 538 memcpy(&pipe_config, &rsxadev->routes[route_idx].config.common, sizeof(pipe_config)); 539 540 // If the stream is already open, don't open it again. 541 if (opening_input ? !ENABLE_LEGACY_INPUT_OPEN && input_open : output_open) { 542 ALOGE("submix_open_validate_l(): %s stream already open.", opening_input ? "Input" : 543 "Output"); 544 return false; 545 } 546 547 SUBMIX_ALOGV("submix_open_validate_l(): sample rate=%d format=%x " 548 "%s_channel_mask=%x", config->sample_rate, config->format, 549 opening_input ? "in" : "out", config->channel_mask); 550 551 // If either stream is open, verify the existing audio config the pipe matches the user 552 // specified config. 553 if (input_open || output_open) { 554 const audio_config * const input_config = opening_input ? config : &pipe_config; 555 const audio_config * const output_config = opening_input ? &pipe_config : config; 556 // Get the channel mask of the open device. 557 pipe_config.channel_mask = 558 opening_input ? rsxadev->routes[route_idx].config.output_channel_mask : 559 rsxadev->routes[route_idx].config.input_channel_mask; 560 if (!audio_config_compare(input_config, output_config)) { 561 ALOGE("submix_open_validate_l(): Unsupported format."); 562 return false; 563 } 564 } 565 return true; 566} 567 568// Must be called with lock held on the submix_audio_device 569static status_t submix_get_route_idx_for_address_l(const struct submix_audio_device * const rsxadev, 570 const char* address, /*in*/ 571 int *idx /*out*/) 572{ 573 // Do we already have a route for this address 574 int route_idx = -1; 575 int route_empty_idx = -1; // index of an empty route slot that can be used if needed 576 for (int i=0 ; i < MAX_ROUTES ; i++) { 577 if (strcmp(rsxadev->routes[i].address, "") == 0) { 578 route_empty_idx = i; 579 } 580 if (strncmp(rsxadev->routes[i].address, address, AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) { 581 route_idx = i; 582 break; 583 } 584 } 585 586 if ((route_idx == -1) && (route_empty_idx == -1)) { 587 ALOGE("Cannot create new route for address %s, max number of routes reached", address); 588 return -ENOMEM; 589 } 590 if (route_idx == -1) { 591 route_idx = route_empty_idx; 592 } 593 *idx = route_idx; 594 return OK; 595} 596 597 598// Calculate the maximum size of the pipe buffer in frames for the specified stream. 599static size_t calculate_stream_pipe_size_in_frames(const struct audio_stream *stream, 600 const struct submix_config *config, 601 const size_t pipe_frames, 602 const size_t stream_frame_size) 603{ 604 const size_t pipe_frame_size = config->pipe_frame_size; 605 const size_t max_frame_size = max(stream_frame_size, pipe_frame_size); 606 return (pipe_frames * config->pipe_frame_size) / max_frame_size; 607} 608 609/* audio HAL functions */ 610 611static uint32_t out_get_sample_rate(const struct audio_stream *stream) 612{ 613 const struct submix_stream_out * const out = audio_stream_get_submix_stream_out( 614 const_cast<struct audio_stream *>(stream)); 615#if ENABLE_RESAMPLING 616 const uint32_t out_rate = out->dev->routes[out->route_handle].config.output_sample_rate; 617#else 618 const uint32_t out_rate = out->dev->routes[out->route_handle].config.common.sample_rate; 619#endif // ENABLE_RESAMPLING 620 SUBMIX_ALOGV("out_get_sample_rate() returns %u for addr %s", 621 out_rate, out->dev->routes[out->route_handle].address); 622 return out_rate; 623} 624 625static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate) 626{ 627 struct submix_stream_out * const out = audio_stream_get_submix_stream_out(stream); 628#if ENABLE_RESAMPLING 629 // The sample rate of the stream can't be changed once it's set since this would change the 630 // output buffer size and hence break playback to the shared pipe. 631 if (rate != out->dev->routes[out->route_handle].config.output_sample_rate) { 632 ALOGE("out_set_sample_rate() resampling enabled can't change sample rate from " 633 "%u to %u for addr %s", 634 out->dev->routes[out->route_handle].config.output_sample_rate, rate, 635 out->dev->routes[out->route_handle].address); 636 return -ENOSYS; 637 } 638#endif // ENABLE_RESAMPLING 639 if (!sample_rate_supported(rate)) { 640 ALOGE("out_set_sample_rate(rate=%u) rate unsupported", rate); 641 return -ENOSYS; 642 } 643 SUBMIX_ALOGV("out_set_sample_rate(rate=%u)", rate); 644 out->dev->routes[out->route_handle].config.common.sample_rate = rate; 645 return 0; 646} 647 648static size_t out_get_buffer_size(const struct audio_stream *stream) 649{ 650 const struct submix_stream_out * const out = audio_stream_get_submix_stream_out( 651 const_cast<struct audio_stream *>(stream)); 652 const struct submix_config * const config = &out->dev->routes[out->route_handle].config; 653 const size_t stream_frame_size = 654 audio_stream_out_frame_size((const struct audio_stream_out *)stream); 655 const size_t buffer_size_frames = calculate_stream_pipe_size_in_frames( 656 stream, config, config->buffer_period_size_frames, stream_frame_size); 657 const size_t buffer_size_bytes = buffer_size_frames * stream_frame_size; 658 SUBMIX_ALOGV("out_get_buffer_size() returns %zu bytes, %zu frames", 659 buffer_size_bytes, buffer_size_frames); 660 return buffer_size_bytes; 661} 662 663static audio_channel_mask_t out_get_channels(const struct audio_stream *stream) 664{ 665 const struct submix_stream_out * const out = audio_stream_get_submix_stream_out( 666 const_cast<struct audio_stream *>(stream)); 667 uint32_t channel_mask = out->dev->routes[out->route_handle].config.output_channel_mask; 668 SUBMIX_ALOGV("out_get_channels() returns %08x", channel_mask); 669 return channel_mask; 670} 671 672static audio_format_t out_get_format(const struct audio_stream *stream) 673{ 674 const struct submix_stream_out * const out = audio_stream_get_submix_stream_out( 675 const_cast<struct audio_stream *>(stream)); 676 const audio_format_t format = out->dev->routes[out->route_handle].config.common.format; 677 SUBMIX_ALOGV("out_get_format() returns %x", format); 678 return format; 679} 680 681static int out_set_format(struct audio_stream *stream, audio_format_t format) 682{ 683 const struct submix_stream_out * const out = audio_stream_get_submix_stream_out(stream); 684 if (format != out->dev->routes[out->route_handle].config.common.format) { 685 ALOGE("out_set_format(format=%x) format unsupported", format); 686 return -ENOSYS; 687 } 688 SUBMIX_ALOGV("out_set_format(format=%x)", format); 689 return 0; 690} 691 692static int out_standby(struct audio_stream *stream) 693{ 694 ALOGI("out_standby()"); 695 struct submix_stream_out * const out = audio_stream_get_submix_stream_out(stream); 696 struct submix_audio_device * const rsxadev = out->dev; 697 698 pthread_mutex_lock(&rsxadev->lock); 699 700 out->output_standby = true; 701 out->frames_written_since_standby = 0; 702 703 pthread_mutex_unlock(&rsxadev->lock); 704 705 return 0; 706} 707 708static int out_dump(const struct audio_stream *stream, int fd) 709{ 710 (void)stream; 711 (void)fd; 712 return 0; 713} 714 715static int out_set_parameters(struct audio_stream *stream, const char *kvpairs) 716{ 717 int exiting = -1; 718 AudioParameter parms = AudioParameter(String8(kvpairs)); 719 SUBMIX_ALOGV("out_set_parameters() kvpairs='%s'", kvpairs); 720 721 // FIXME this is using hard-coded strings but in the future, this functionality will be 722 // converted to use audio HAL extensions required to support tunneling 723 if ((parms.getInt(String8("exiting"), exiting) == NO_ERROR) && (exiting > 0)) { 724 struct submix_audio_device * const rsxadev = 725 audio_stream_get_submix_stream_out(stream)->dev; 726 pthread_mutex_lock(&rsxadev->lock); 727 { // using the sink 728 sp<MonoPipe> sink = 729 rsxadev->routes[audio_stream_get_submix_stream_out(stream)->route_handle] 730 .rsxSink; 731 if (sink == NULL) { 732 pthread_mutex_unlock(&rsxadev->lock); 733 return 0; 734 } 735 736 ALOGD("out_set_parameters(): shutting down MonoPipe sink"); 737 sink->shutdown(true); 738 } // done using the sink 739 pthread_mutex_unlock(&rsxadev->lock); 740 } 741 return 0; 742} 743 744static char * out_get_parameters(const struct audio_stream *stream, const char *keys) 745{ 746 (void)stream; 747 (void)keys; 748 return strdup(""); 749} 750 751static uint32_t out_get_latency(const struct audio_stream_out *stream) 752{ 753 const struct submix_stream_out * const out = audio_stream_out_get_submix_stream_out( 754 const_cast<struct audio_stream_out *>(stream)); 755 const struct submix_config * const config = &out->dev->routes[out->route_handle].config; 756 const size_t stream_frame_size = 757 audio_stream_out_frame_size(stream); 758 const size_t buffer_size_frames = calculate_stream_pipe_size_in_frames( 759 &stream->common, config, config->buffer_size_frames, stream_frame_size); 760 const uint32_t sample_rate = out_get_sample_rate(&stream->common); 761 const uint32_t latency_ms = (buffer_size_frames * 1000) / sample_rate; 762 SUBMIX_ALOGV("out_get_latency() returns %u ms, size in frames %zu, sample rate %u", 763 latency_ms, buffer_size_frames, sample_rate); 764 return latency_ms; 765} 766 767static int out_set_volume(struct audio_stream_out *stream, float left, 768 float right) 769{ 770 (void)stream; 771 (void)left; 772 (void)right; 773 return -ENOSYS; 774} 775 776static ssize_t out_write(struct audio_stream_out *stream, const void* buffer, 777 size_t bytes) 778{ 779 SUBMIX_ALOGV("out_write(bytes=%zd)", bytes); 780 ssize_t written_frames = 0; 781 const size_t frame_size = audio_stream_out_frame_size(stream); 782 struct submix_stream_out * const out = audio_stream_out_get_submix_stream_out(stream); 783 struct submix_audio_device * const rsxadev = out->dev; 784 const size_t frames = bytes / frame_size; 785 786 pthread_mutex_lock(&rsxadev->lock); 787 788 out->output_standby = false; 789 790 sp<MonoPipe> sink = rsxadev->routes[out->route_handle].rsxSink; 791 if (sink != NULL) { 792 if (sink->isShutdown()) { 793 sink.clear(); 794 pthread_mutex_unlock(&rsxadev->lock); 795 SUBMIX_ALOGV("out_write(): pipe shutdown, ignoring the write."); 796 // the pipe has already been shutdown, this buffer will be lost but we must 797 // simulate timing so we don't drain the output faster than realtime 798 usleep(frames * 1000000 / out_get_sample_rate(&stream->common)); 799 return bytes; 800 } 801 } else { 802 pthread_mutex_unlock(&rsxadev->lock); 803 ALOGE("out_write without a pipe!"); 804 ALOG_ASSERT("out_write without a pipe!"); 805 return 0; 806 } 807 808 // If the write to the sink would block when no input stream is present, flush enough frames 809 // from the pipe to make space to write the most recent data. 810 { 811 const size_t availableToWrite = sink->availableToWrite(); 812 sp<MonoPipeReader> source = rsxadev->routes[out->route_handle].rsxSource; 813 if (rsxadev->routes[out->route_handle].input == NULL && availableToWrite < frames) { 814 static uint8_t flush_buffer[64]; 815 const size_t flushBufferSizeFrames = sizeof(flush_buffer) / frame_size; 816 size_t frames_to_flush_from_source = frames - availableToWrite; 817 SUBMIX_ALOGV("out_write(): flushing %llu frames from the pipe to avoid blocking", 818 (unsigned long long)frames_to_flush_from_source); 819 while (frames_to_flush_from_source) { 820 const size_t flush_size = min(frames_to_flush_from_source, flushBufferSizeFrames); 821 frames_to_flush_from_source -= flush_size; 822 // read does not block 823 source->read(flush_buffer, flush_size); 824 } 825 } 826 } 827 828 pthread_mutex_unlock(&rsxadev->lock); 829 830 written_frames = sink->write(buffer, frames); 831 832#if LOG_STREAMS_TO_FILES 833 if (out->log_fd >= 0) write(out->log_fd, buffer, written_frames * frame_size); 834#endif // LOG_STREAMS_TO_FILES 835 836 if (written_frames < 0) { 837 if (written_frames == (ssize_t)NEGOTIATE) { 838 ALOGE("out_write() write to pipe returned NEGOTIATE"); 839 840 pthread_mutex_lock(&rsxadev->lock); 841 sink.clear(); 842 pthread_mutex_unlock(&rsxadev->lock); 843 844 written_frames = 0; 845 return 0; 846 } else { 847 // write() returned UNDERRUN or WOULD_BLOCK, retry 848 ALOGE("out_write() write to pipe returned unexpected %zd", written_frames); 849 written_frames = sink->write(buffer, frames); 850 } 851 } 852 853 pthread_mutex_lock(&rsxadev->lock); 854 sink.clear(); 855 if (written_frames > 0) { 856 out->frames_written_since_standby += written_frames; 857 out->frames_written += written_frames; 858 } 859 pthread_mutex_unlock(&rsxadev->lock); 860 861 if (written_frames < 0) { 862 ALOGE("out_write() failed writing to pipe with %zd", written_frames); 863 return 0; 864 } 865 const ssize_t written_bytes = written_frames * frame_size; 866 SUBMIX_ALOGV("out_write() wrote %zd bytes %zd frames", written_bytes, written_frames); 867 return written_bytes; 868} 869 870static int out_get_presentation_position(const struct audio_stream_out *stream, 871 uint64_t *frames, struct timespec *timestamp) 872{ 873 if (stream == NULL || frames == NULL || timestamp == NULL) { 874 return -EINVAL; 875 } 876 877 const submix_stream_out *out = audio_stream_out_get_submix_stream_out( 878 const_cast<struct audio_stream_out *>(stream)); 879 struct submix_audio_device * const rsxadev = out->dev; 880 881 int ret = -EWOULDBLOCK; 882 pthread_mutex_lock(&rsxadev->lock); 883 const ssize_t frames_in_pipe = 884 rsxadev->routes[out->route_handle].rsxSource->availableToRead(); 885 if (CC_UNLIKELY(frames_in_pipe < 0)) { 886 *frames = out->frames_written; 887 ret = 0; 888 } else if (out->frames_written >= (uint64_t)frames_in_pipe) { 889 *frames = out->frames_written - frames_in_pipe; 890 ret = 0; 891 } 892 pthread_mutex_unlock(&rsxadev->lock); 893 894 if (ret == 0) { 895 clock_gettime(CLOCK_MONOTONIC, timestamp); 896 } 897 898 SUBMIX_ALOGV("out_get_presentation_position() got frames=%llu timestamp sec=%llu", 899 frames ? (unsigned long long)*frames : -1ULL, 900 timestamp ? (unsigned long long)timestamp->tv_sec : -1ULL); 901 902 return ret; 903} 904 905static int out_get_render_position(const struct audio_stream_out *stream, 906 uint32_t *dsp_frames) 907{ 908 if (stream == NULL || dsp_frames == NULL) { 909 return -EINVAL; 910 } 911 912 const submix_stream_out *out = audio_stream_out_get_submix_stream_out( 913 const_cast<struct audio_stream_out *>(stream)); 914 struct submix_audio_device * const rsxadev = out->dev; 915 916 pthread_mutex_lock(&rsxadev->lock); 917 const ssize_t frames_in_pipe = 918 rsxadev->routes[out->route_handle].rsxSource->availableToRead(); 919 if (CC_UNLIKELY(frames_in_pipe < 0)) { 920 *dsp_frames = (uint32_t)out->frames_written_since_standby; 921 } else { 922 *dsp_frames = out->frames_written_since_standby > (uint64_t) frames_in_pipe ? 923 (uint32_t)(out->frames_written_since_standby - frames_in_pipe) : 0; 924 } 925 pthread_mutex_unlock(&rsxadev->lock); 926 927 return 0; 928} 929 930static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 931{ 932 (void)stream; 933 (void)effect; 934 return 0; 935} 936 937static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 938{ 939 (void)stream; 940 (void)effect; 941 return 0; 942} 943 944static int out_get_next_write_timestamp(const struct audio_stream_out *stream, 945 int64_t *timestamp) 946{ 947 (void)stream; 948 (void)timestamp; 949 return -EINVAL; 950} 951 952/** audio_stream_in implementation **/ 953static uint32_t in_get_sample_rate(const struct audio_stream *stream) 954{ 955 const struct submix_stream_in * const in = audio_stream_get_submix_stream_in( 956 const_cast<struct audio_stream*>(stream)); 957#if ENABLE_RESAMPLING 958 const uint32_t rate = in->dev->routes[in->route_handle].config.input_sample_rate; 959#else 960 const uint32_t rate = in->dev->routes[in->route_handle].config.common.sample_rate; 961#endif // ENABLE_RESAMPLING 962 SUBMIX_ALOGV("in_get_sample_rate() returns %u", rate); 963 return rate; 964} 965 966static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate) 967{ 968 const struct submix_stream_in * const in = audio_stream_get_submix_stream_in(stream); 969#if ENABLE_RESAMPLING 970 // The sample rate of the stream can't be changed once it's set since this would change the 971 // input buffer size and hence break recording from the shared pipe. 972 if (rate != in->dev->routes[in->route_handle].config.input_sample_rate) { 973 ALOGE("in_set_sample_rate() resampling enabled can't change sample rate from " 974 "%u to %u", in->dev->routes[in->route_handle].config.input_sample_rate, rate); 975 return -ENOSYS; 976 } 977#endif // ENABLE_RESAMPLING 978 if (!sample_rate_supported(rate)) { 979 ALOGE("in_set_sample_rate(rate=%u) rate unsupported", rate); 980 return -ENOSYS; 981 } 982 in->dev->routes[in->route_handle].config.common.sample_rate = rate; 983 SUBMIX_ALOGV("in_set_sample_rate() set %u", rate); 984 return 0; 985} 986 987static size_t in_get_buffer_size(const struct audio_stream *stream) 988{ 989 const struct submix_stream_in * const in = audio_stream_get_submix_stream_in( 990 const_cast<struct audio_stream*>(stream)); 991 const struct submix_config * const config = &in->dev->routes[in->route_handle].config; 992 const size_t stream_frame_size = 993 audio_stream_in_frame_size((const struct audio_stream_in *)stream); 994 size_t buffer_size_frames = calculate_stream_pipe_size_in_frames( 995 stream, config, config->buffer_period_size_frames, stream_frame_size); 996#if ENABLE_RESAMPLING 997 // Scale the size of the buffer based upon the maximum number of frames that could be returned 998 // given the ratio of output to input sample rate. 999 buffer_size_frames = (size_t)(((float)buffer_size_frames * 1000 (float)config->input_sample_rate) / 1001 (float)config->output_sample_rate); 1002#endif // ENABLE_RESAMPLING 1003 const size_t buffer_size_bytes = buffer_size_frames * stream_frame_size; 1004 SUBMIX_ALOGV("in_get_buffer_size() returns %zu bytes, %zu frames", buffer_size_bytes, 1005 buffer_size_frames); 1006 return buffer_size_bytes; 1007} 1008 1009static audio_channel_mask_t in_get_channels(const struct audio_stream *stream) 1010{ 1011 const struct submix_stream_in * const in = audio_stream_get_submix_stream_in( 1012 const_cast<struct audio_stream*>(stream)); 1013 const audio_channel_mask_t channel_mask = 1014 in->dev->routes[in->route_handle].config.input_channel_mask; 1015 SUBMIX_ALOGV("in_get_channels() returns %x", channel_mask); 1016 return channel_mask; 1017} 1018 1019static audio_format_t in_get_format(const struct audio_stream *stream) 1020{ 1021 const struct submix_stream_in * const in = audio_stream_get_submix_stream_in( 1022 const_cast<struct audio_stream*>(stream)); 1023 const audio_format_t format = in->dev->routes[in->route_handle].config.common.format; 1024 SUBMIX_ALOGV("in_get_format() returns %x", format); 1025 return format; 1026} 1027 1028static int in_set_format(struct audio_stream *stream, audio_format_t format) 1029{ 1030 const struct submix_stream_in * const in = audio_stream_get_submix_stream_in(stream); 1031 if (format != in->dev->routes[in->route_handle].config.common.format) { 1032 ALOGE("in_set_format(format=%x) format unsupported", format); 1033 return -ENOSYS; 1034 } 1035 SUBMIX_ALOGV("in_set_format(format=%x)", format); 1036 return 0; 1037} 1038 1039static int in_standby(struct audio_stream *stream) 1040{ 1041 ALOGI("in_standby()"); 1042 struct submix_stream_in * const in = audio_stream_get_submix_stream_in(stream); 1043 struct submix_audio_device * const rsxadev = in->dev; 1044 1045 pthread_mutex_lock(&rsxadev->lock); 1046 1047 in->input_standby = true; 1048 1049 pthread_mutex_unlock(&rsxadev->lock); 1050 1051 return 0; 1052} 1053 1054static int in_dump(const struct audio_stream *stream, int fd) 1055{ 1056 (void)stream; 1057 (void)fd; 1058 return 0; 1059} 1060 1061static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) 1062{ 1063 (void)stream; 1064 (void)kvpairs; 1065 return 0; 1066} 1067 1068static char * in_get_parameters(const struct audio_stream *stream, 1069 const char *keys) 1070{ 1071 (void)stream; 1072 (void)keys; 1073 return strdup(""); 1074} 1075 1076static int in_set_gain(struct audio_stream_in *stream, float gain) 1077{ 1078 (void)stream; 1079 (void)gain; 1080 return 0; 1081} 1082 1083static ssize_t in_read(struct audio_stream_in *stream, void* buffer, 1084 size_t bytes) 1085{ 1086 struct submix_stream_in * const in = audio_stream_in_get_submix_stream_in(stream); 1087 struct submix_audio_device * const rsxadev = in->dev; 1088 const size_t frame_size = audio_stream_in_frame_size(stream); 1089 const size_t frames_to_read = bytes / frame_size; 1090 1091 SUBMIX_ALOGV("in_read bytes=%zu", bytes); 1092 pthread_mutex_lock(&rsxadev->lock); 1093 1094 const bool output_standby = rsxadev->routes[in->route_handle].output == NULL 1095 ? true : rsxadev->routes[in->route_handle].output->output_standby; 1096 const bool output_standby_transition = (in->output_standby_rec_thr != output_standby); 1097 in->output_standby_rec_thr = output_standby; 1098 1099 if (in->input_standby || output_standby_transition) { 1100 in->input_standby = false; 1101 // keep track of when we exit input standby (== first read == start "real recording") 1102 // or when we start recording silence, and reset projected time 1103 int rc = clock_gettime(CLOCK_MONOTONIC, &in->record_start_time); 1104 if (rc == 0) { 1105 in->read_counter_frames = 0; 1106 } 1107 } 1108 1109 in->read_counter_frames += frames_to_read; 1110 size_t remaining_frames = frames_to_read; 1111 1112 { 1113 // about to read from audio source 1114 sp<MonoPipeReader> source = rsxadev->routes[in->route_handle].rsxSource; 1115 if (source == NULL) { 1116 in->read_error_count++;// ok if it rolls over 1117 ALOGE_IF(in->read_error_count < MAX_READ_ERROR_LOGS, 1118 "no audio pipe yet we're trying to read! (not all errors will be logged)"); 1119 pthread_mutex_unlock(&rsxadev->lock); 1120 usleep(frames_to_read * 1000000 / in_get_sample_rate(&stream->common)); 1121 memset(buffer, 0, bytes); 1122 return bytes; 1123 } 1124 1125 pthread_mutex_unlock(&rsxadev->lock); 1126 1127 // read the data from the pipe (it's non blocking) 1128 int attempts = 0; 1129 char* buff = (char*)buffer; 1130#if ENABLE_CHANNEL_CONVERSION 1131 // Determine whether channel conversion is required. 1132 const uint32_t input_channels = audio_channel_count_from_in_mask( 1133 rsxadev->routes[in->route_handle].config.input_channel_mask); 1134 const uint32_t output_channels = audio_channel_count_from_out_mask( 1135 rsxadev->routes[in->route_handle].config.output_channel_mask); 1136 if (input_channels != output_channels) { 1137 SUBMIX_ALOGV("in_read(): %d output channels will be converted to %d " 1138 "input channels", output_channels, input_channels); 1139 // Only support 16-bit PCM channel conversion from mono to stereo or stereo to mono. 1140 ALOG_ASSERT(rsxadev->routes[in->route_handle].config.common.format == 1141 AUDIO_FORMAT_PCM_16_BIT); 1142 ALOG_ASSERT((input_channels == 1 && output_channels == 2) || 1143 (input_channels == 2 && output_channels == 1)); 1144 } 1145#endif // ENABLE_CHANNEL_CONVERSION 1146 1147#if ENABLE_RESAMPLING 1148 const uint32_t input_sample_rate = in_get_sample_rate(&stream->common); 1149 const uint32_t output_sample_rate = 1150 rsxadev->routes[in->route_handle].config.output_sample_rate; 1151 const size_t resampler_buffer_size_frames = 1152 sizeof(rsxadev->routes[in->route_handle].resampler_buffer) / 1153 sizeof(rsxadev->routes[in->route_handle].resampler_buffer[0]); 1154 float resampler_ratio = 1.0f; 1155 // Determine whether resampling is required. 1156 if (input_sample_rate != output_sample_rate) { 1157 resampler_ratio = (float)output_sample_rate / (float)input_sample_rate; 1158 // Only support 16-bit PCM mono resampling. 1159 // NOTE: Resampling is performed after the channel conversion step. 1160 ALOG_ASSERT(rsxadev->routes[in->route_handle].config.common.format == 1161 AUDIO_FORMAT_PCM_16_BIT); 1162 ALOG_ASSERT(audio_channel_count_from_in_mask( 1163 rsxadev->routes[in->route_handle].config.input_channel_mask) == 1); 1164 } 1165#endif // ENABLE_RESAMPLING 1166 1167 while ((remaining_frames > 0) && (attempts < MAX_READ_ATTEMPTS)) { 1168 ssize_t frames_read = -1977; 1169 size_t read_frames = remaining_frames; 1170#if ENABLE_RESAMPLING 1171 char* const saved_buff = buff; 1172 if (resampler_ratio != 1.0f) { 1173 // Calculate the number of frames from the pipe that need to be read to generate 1174 // the data for the input stream read. 1175 const size_t frames_required_for_resampler = (size_t)( 1176 (float)read_frames * (float)resampler_ratio); 1177 read_frames = min(frames_required_for_resampler, resampler_buffer_size_frames); 1178 // Read into the resampler buffer. 1179 buff = (char*)rsxadev->routes[in->route_handle].resampler_buffer; 1180 } 1181#endif // ENABLE_RESAMPLING 1182#if ENABLE_CHANNEL_CONVERSION 1183 if (output_channels == 1 && input_channels == 2) { 1184 // Need to read half the requested frames since the converted output 1185 // data will take twice the space (mono->stereo). 1186 read_frames /= 2; 1187 } 1188#endif // ENABLE_CHANNEL_CONVERSION 1189 1190 SUBMIX_ALOGV("in_read(): frames available to read %zd", source->availableToRead()); 1191 1192 frames_read = source->read(buff, read_frames); 1193 1194 SUBMIX_ALOGV("in_read(): frames read %zd", frames_read); 1195 1196#if ENABLE_CHANNEL_CONVERSION 1197 // Perform in-place channel conversion. 1198 // NOTE: In the following "input stream" refers to the data returned by this function 1199 // and "output stream" refers to the data read from the pipe. 1200 if (input_channels != output_channels && frames_read > 0) { 1201 int16_t *data = (int16_t*)buff; 1202 if (output_channels == 2 && input_channels == 1) { 1203 // Offset into the output stream data in samples. 1204 ssize_t output_stream_offset = 0; 1205 for (ssize_t input_stream_frame = 0; input_stream_frame < frames_read; 1206 input_stream_frame++, output_stream_offset += 2) { 1207 // Average the content from both channels. 1208 data[input_stream_frame] = ((int32_t)data[output_stream_offset] + 1209 (int32_t)data[output_stream_offset + 1]) / 2; 1210 } 1211 } else if (output_channels == 1 && input_channels == 2) { 1212 // Offset into the input stream data in samples. 1213 ssize_t input_stream_offset = (frames_read - 1) * 2; 1214 for (ssize_t output_stream_frame = frames_read - 1; output_stream_frame >= 0; 1215 output_stream_frame--, input_stream_offset -= 2) { 1216 const short sample = data[output_stream_frame]; 1217 data[input_stream_offset] = sample; 1218 data[input_stream_offset + 1] = sample; 1219 } 1220 } 1221 } 1222#endif // ENABLE_CHANNEL_CONVERSION 1223 1224#if ENABLE_RESAMPLING 1225 if (resampler_ratio != 1.0f) { 1226 SUBMIX_ALOGV("in_read(): resampling %zd frames", frames_read); 1227 const int16_t * const data = (int16_t*)buff; 1228 int16_t * const resampled_buffer = (int16_t*)saved_buff; 1229 // Resample with *no* filtering - if the data from the ouptut stream was really 1230 // sampled at a different rate this will result in very nasty aliasing. 1231 const float output_stream_frames = (float)frames_read; 1232 size_t input_stream_frame = 0; 1233 for (float output_stream_frame = 0.0f; 1234 output_stream_frame < output_stream_frames && 1235 input_stream_frame < remaining_frames; 1236 output_stream_frame += resampler_ratio, input_stream_frame++) { 1237 resampled_buffer[input_stream_frame] = data[(size_t)output_stream_frame]; 1238 } 1239 ALOG_ASSERT(input_stream_frame <= (ssize_t)resampler_buffer_size_frames); 1240 SUBMIX_ALOGV("in_read(): resampler produced %zd frames", input_stream_frame); 1241 frames_read = input_stream_frame; 1242 buff = saved_buff; 1243 } 1244#endif // ENABLE_RESAMPLING 1245 1246 if (frames_read > 0) { 1247#if LOG_STREAMS_TO_FILES 1248 if (in->log_fd >= 0) write(in->log_fd, buff, frames_read * frame_size); 1249#endif // LOG_STREAMS_TO_FILES 1250 1251 remaining_frames -= frames_read; 1252 buff += frames_read * frame_size; 1253 SUBMIX_ALOGV(" in_read (att=%d) got %zd frames, remaining=%zu", 1254 attempts, frames_read, remaining_frames); 1255 } else { 1256 attempts++; 1257 SUBMIX_ALOGE(" in_read read returned %zd", frames_read); 1258 usleep(READ_ATTEMPT_SLEEP_MS * 1000); 1259 } 1260 } 1261 // done using the source 1262 pthread_mutex_lock(&rsxadev->lock); 1263 source.clear(); 1264 pthread_mutex_unlock(&rsxadev->lock); 1265 } 1266 1267 if (remaining_frames > 0) { 1268 const size_t remaining_bytes = remaining_frames * frame_size; 1269 SUBMIX_ALOGV(" clearing remaining_frames = %zu", remaining_frames); 1270 memset(((char*)buffer)+ bytes - remaining_bytes, 0, remaining_bytes); 1271 } 1272 1273 // compute how much we need to sleep after reading the data by comparing the wall clock with 1274 // the projected time at which we should return. 1275 struct timespec time_after_read;// wall clock after reading from the pipe 1276 struct timespec record_duration;// observed record duration 1277 int rc = clock_gettime(CLOCK_MONOTONIC, &time_after_read); 1278 const uint32_t sample_rate = in_get_sample_rate(&stream->common); 1279 if (rc == 0) { 1280 // for how long have we been recording? 1281 record_duration.tv_sec = time_after_read.tv_sec - in->record_start_time.tv_sec; 1282 record_duration.tv_nsec = time_after_read.tv_nsec - in->record_start_time.tv_nsec; 1283 if (record_duration.tv_nsec < 0) { 1284 record_duration.tv_sec--; 1285 record_duration.tv_nsec += 1000000000; 1286 } 1287 1288 // read_counter_frames contains the number of frames that have been read since the 1289 // beginning of recording (including this call): it's converted to usec and compared to 1290 // how long we've been recording for, which gives us how long we must wait to sync the 1291 // projected recording time, and the observed recording time. 1292 long projected_vs_observed_offset_us = 1293 ((int64_t)(in->read_counter_frames 1294 - (record_duration.tv_sec*sample_rate))) 1295 * 1000000 / sample_rate 1296 - (record_duration.tv_nsec / 1000); 1297 1298 SUBMIX_ALOGV(" record duration %5lds %3ldms, will wait: %7ldus", 1299 record_duration.tv_sec, record_duration.tv_nsec/1000000, 1300 projected_vs_observed_offset_us); 1301 if (projected_vs_observed_offset_us > 0) { 1302 usleep(projected_vs_observed_offset_us); 1303 } 1304 } 1305 1306 SUBMIX_ALOGV("in_read returns %zu", bytes); 1307 return bytes; 1308 1309} 1310 1311static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream) 1312{ 1313 (void)stream; 1314 return 0; 1315} 1316 1317static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 1318{ 1319 (void)stream; 1320 (void)effect; 1321 return 0; 1322} 1323 1324static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 1325{ 1326 (void)stream; 1327 (void)effect; 1328 return 0; 1329} 1330 1331static int adev_open_output_stream(struct audio_hw_device *dev, 1332 audio_io_handle_t handle, 1333 audio_devices_t devices, 1334 audio_output_flags_t flags, 1335 struct audio_config *config, 1336 struct audio_stream_out **stream_out, 1337 const char *address) 1338{ 1339 struct submix_audio_device * const rsxadev = audio_hw_device_get_submix_audio_device(dev); 1340 ALOGD("adev_open_output_stream(address=%s)", address); 1341 struct submix_stream_out *out; 1342 bool force_pipe_creation = false; 1343 (void)handle; 1344 (void)devices; 1345 (void)flags; 1346 1347 *stream_out = NULL; 1348 1349 // Make sure it's possible to open the device given the current audio config. 1350 submix_sanitize_config(config, false); 1351 1352 int route_idx = -1; 1353 1354 pthread_mutex_lock(&rsxadev->lock); 1355 1356 status_t res = submix_get_route_idx_for_address_l(rsxadev, address, &route_idx); 1357 if (res != OK) { 1358 ALOGE("Error %d looking for address=%s in adev_open_output_stream", res, address); 1359 pthread_mutex_unlock(&rsxadev->lock); 1360 return res; 1361 } 1362 1363 if (!submix_open_validate_l(rsxadev, route_idx, config, false)) { 1364 ALOGE("adev_open_output_stream(): Unable to open output stream for address %s", address); 1365 pthread_mutex_unlock(&rsxadev->lock); 1366 return -EINVAL; 1367 } 1368 1369 out = (struct submix_stream_out *)calloc(1, sizeof(struct submix_stream_out)); 1370 if (!out) { 1371 pthread_mutex_unlock(&rsxadev->lock); 1372 return -ENOMEM; 1373 } 1374 1375 // Initialize the function pointer tables (v-tables). 1376 out->stream.common.get_sample_rate = out_get_sample_rate; 1377 out->stream.common.set_sample_rate = out_set_sample_rate; 1378 out->stream.common.get_buffer_size = out_get_buffer_size; 1379 out->stream.common.get_channels = out_get_channels; 1380 out->stream.common.get_format = out_get_format; 1381 out->stream.common.set_format = out_set_format; 1382 out->stream.common.standby = out_standby; 1383 out->stream.common.dump = out_dump; 1384 out->stream.common.set_parameters = out_set_parameters; 1385 out->stream.common.get_parameters = out_get_parameters; 1386 out->stream.common.add_audio_effect = out_add_audio_effect; 1387 out->stream.common.remove_audio_effect = out_remove_audio_effect; 1388 out->stream.get_latency = out_get_latency; 1389 out->stream.set_volume = out_set_volume; 1390 out->stream.write = out_write; 1391 out->stream.get_render_position = out_get_render_position; 1392 out->stream.get_next_write_timestamp = out_get_next_write_timestamp; 1393 out->stream.get_presentation_position = out_get_presentation_position; 1394 1395#if ENABLE_RESAMPLING 1396 // Recreate the pipe with the correct sample rate so that MonoPipe.write() rate limits 1397 // writes correctly. 1398 force_pipe_creation = rsxadev->routes[route_idx].config.common.sample_rate 1399 != config->sample_rate; 1400#endif // ENABLE_RESAMPLING 1401 1402 // If the sink has been shutdown or pipe recreation is forced (see above), delete the pipe so 1403 // that it's recreated. 1404 if ((rsxadev->routes[route_idx].rsxSink != NULL 1405 && rsxadev->routes[route_idx].rsxSink->isShutdown()) || force_pipe_creation) { 1406 submix_audio_device_release_pipe_l(rsxadev, route_idx); 1407 } 1408 1409 // Store a pointer to the device from the output stream. 1410 out->dev = rsxadev; 1411 // Initialize the pipe. 1412 ALOGV("adev_open_output_stream(): about to create pipe at index %d", route_idx); 1413 submix_audio_device_create_pipe_l(rsxadev, config, DEFAULT_PIPE_SIZE_IN_FRAMES, 1414 DEFAULT_PIPE_PERIOD_COUNT, NULL, out, address, route_idx); 1415#if LOG_STREAMS_TO_FILES 1416 out->log_fd = open(LOG_STREAM_OUT_FILENAME, O_CREAT | O_TRUNC | O_WRONLY, 1417 LOG_STREAM_FILE_PERMISSIONS); 1418 ALOGE_IF(out->log_fd < 0, "adev_open_output_stream(): log file open failed %s", 1419 strerror(errno)); 1420 ALOGV("adev_open_output_stream(): log_fd = %d", out->log_fd); 1421#endif // LOG_STREAMS_TO_FILES 1422 // Return the output stream. 1423 *stream_out = &out->stream; 1424 1425 pthread_mutex_unlock(&rsxadev->lock); 1426 return 0; 1427} 1428 1429static void adev_close_output_stream(struct audio_hw_device *dev, 1430 struct audio_stream_out *stream) 1431{ 1432 struct submix_audio_device * rsxadev = audio_hw_device_get_submix_audio_device( 1433 const_cast<struct audio_hw_device*>(dev)); 1434 struct submix_stream_out * const out = audio_stream_out_get_submix_stream_out(stream); 1435 1436 pthread_mutex_lock(&rsxadev->lock); 1437 ALOGD("adev_close_output_stream() addr = %s", rsxadev->routes[out->route_handle].address); 1438 submix_audio_device_destroy_pipe_l(audio_hw_device_get_submix_audio_device(dev), NULL, out); 1439#if LOG_STREAMS_TO_FILES 1440 if (out->log_fd >= 0) close(out->log_fd); 1441#endif // LOG_STREAMS_TO_FILES 1442 1443 pthread_mutex_unlock(&rsxadev->lock); 1444 free(out); 1445} 1446 1447static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) 1448{ 1449 (void)dev; 1450 (void)kvpairs; 1451 return -ENOSYS; 1452} 1453 1454static char * adev_get_parameters(const struct audio_hw_device *dev, 1455 const char *keys) 1456{ 1457 (void)dev; 1458 (void)keys; 1459 return strdup("");; 1460} 1461 1462static int adev_init_check(const struct audio_hw_device *dev) 1463{ 1464 ALOGI("adev_init_check()"); 1465 (void)dev; 1466 return 0; 1467} 1468 1469static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) 1470{ 1471 (void)dev; 1472 (void)volume; 1473 return -ENOSYS; 1474} 1475 1476static int adev_set_master_volume(struct audio_hw_device *dev, float volume) 1477{ 1478 (void)dev; 1479 (void)volume; 1480 return -ENOSYS; 1481} 1482 1483static int adev_get_master_volume(struct audio_hw_device *dev, float *volume) 1484{ 1485 (void)dev; 1486 (void)volume; 1487 return -ENOSYS; 1488} 1489 1490static int adev_set_master_mute(struct audio_hw_device *dev, bool muted) 1491{ 1492 (void)dev; 1493 (void)muted; 1494 return -ENOSYS; 1495} 1496 1497static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted) 1498{ 1499 (void)dev; 1500 (void)muted; 1501 return -ENOSYS; 1502} 1503 1504static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) 1505{ 1506 (void)dev; 1507 (void)mode; 1508 return 0; 1509} 1510 1511static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) 1512{ 1513 (void)dev; 1514 (void)state; 1515 return -ENOSYS; 1516} 1517 1518static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) 1519{ 1520 (void)dev; 1521 (void)state; 1522 return -ENOSYS; 1523} 1524 1525static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, 1526 const struct audio_config *config) 1527{ 1528 if (audio_is_linear_pcm(config->format)) { 1529 size_t max_buffer_period_size_frames = 0; 1530 struct submix_audio_device * rsxadev = audio_hw_device_get_submix_audio_device( 1531 const_cast<struct audio_hw_device*>(dev)); 1532 // look for the largest buffer period size 1533 for (int i = 0 ; i < MAX_ROUTES ; i++) { 1534 if (rsxadev->routes[i].config.buffer_period_size_frames > max_buffer_period_size_frames) 1535 { 1536 max_buffer_period_size_frames = rsxadev->routes[i].config.buffer_period_size_frames; 1537 } 1538 } 1539 const size_t frame_size_in_bytes = audio_channel_count_from_in_mask(config->channel_mask) * 1540 audio_bytes_per_sample(config->format); 1541 const size_t buffer_size = max_buffer_period_size_frames * frame_size_in_bytes; 1542 SUBMIX_ALOGV("adev_get_input_buffer_size() returns %zu bytes, %zu frames", 1543 buffer_size, max_buffer_period_size_frames); 1544 return buffer_size; 1545 } 1546 return 0; 1547} 1548 1549static int adev_open_input_stream(struct audio_hw_device *dev, 1550 audio_io_handle_t handle, 1551 audio_devices_t devices, 1552 struct audio_config *config, 1553 struct audio_stream_in **stream_in, 1554 audio_input_flags_t flags __unused, 1555 const char *address, 1556 audio_source_t source __unused) 1557{ 1558 struct submix_audio_device *rsxadev = audio_hw_device_get_submix_audio_device(dev); 1559 struct submix_stream_in *in; 1560 ALOGD("adev_open_input_stream(addr=%s)", address); 1561 (void)handle; 1562 (void)devices; 1563 1564 *stream_in = NULL; 1565 1566 // Do we already have a route for this address 1567 int route_idx = -1; 1568 1569 pthread_mutex_lock(&rsxadev->lock); 1570 1571 status_t res = submix_get_route_idx_for_address_l(rsxadev, address, &route_idx); 1572 if (res != OK) { 1573 ALOGE("Error %d looking for address=%s in adev_open_input_stream", res, address); 1574 pthread_mutex_unlock(&rsxadev->lock); 1575 return res; 1576 } 1577 1578 // Make sure it's possible to open the device given the current audio config. 1579 submix_sanitize_config(config, true); 1580 if (!submix_open_validate_l(rsxadev, route_idx, config, true)) { 1581 ALOGE("adev_open_input_stream(): Unable to open input stream."); 1582 pthread_mutex_unlock(&rsxadev->lock); 1583 return -EINVAL; 1584 } 1585 1586#if ENABLE_LEGACY_INPUT_OPEN 1587 in = rsxadev->routes[route_idx].input; 1588 if (in) { 1589 in->ref_count++; 1590 sp<MonoPipe> sink = rsxadev->routes[route_idx].rsxSink; 1591 ALOG_ASSERT(sink != NULL); 1592 // If the sink has been shutdown, delete the pipe. 1593 if (sink != NULL) { 1594 if (sink->isShutdown()) { 1595 ALOGD(" Non-NULL shut down sink when opening input stream, releasing, refcount=%d", 1596 in->ref_count); 1597 submix_audio_device_release_pipe_l(rsxadev, in->route_handle); 1598 } else { 1599 ALOGD(" Non-NULL sink when opening input stream, refcount=%d", in->ref_count); 1600 } 1601 } else { 1602 ALOGE("NULL sink when opening input stream, refcount=%d", in->ref_count); 1603 } 1604 } 1605#else 1606 in = NULL; 1607#endif // ENABLE_LEGACY_INPUT_OPEN 1608 1609 if (!in) { 1610 in = (struct submix_stream_in *)calloc(1, sizeof(struct submix_stream_in)); 1611 if (!in) return -ENOMEM; 1612 in->ref_count = 1; 1613 1614 // Initialize the function pointer tables (v-tables). 1615 in->stream.common.get_sample_rate = in_get_sample_rate; 1616 in->stream.common.set_sample_rate = in_set_sample_rate; 1617 in->stream.common.get_buffer_size = in_get_buffer_size; 1618 in->stream.common.get_channels = in_get_channels; 1619 in->stream.common.get_format = in_get_format; 1620 in->stream.common.set_format = in_set_format; 1621 in->stream.common.standby = in_standby; 1622 in->stream.common.dump = in_dump; 1623 in->stream.common.set_parameters = in_set_parameters; 1624 in->stream.common.get_parameters = in_get_parameters; 1625 in->stream.common.add_audio_effect = in_add_audio_effect; 1626 in->stream.common.remove_audio_effect = in_remove_audio_effect; 1627 in->stream.set_gain = in_set_gain; 1628 in->stream.read = in_read; 1629 in->stream.get_input_frames_lost = in_get_input_frames_lost; 1630 1631 in->dev = rsxadev; 1632#if LOG_STREAMS_TO_FILES 1633 in->log_fd = -1; 1634#endif 1635 } 1636 1637 // Initialize the input stream. 1638 in->read_counter_frames = 0; 1639 in->input_standby = true; 1640 if (rsxadev->routes[route_idx].output != NULL) { 1641 in->output_standby_rec_thr = rsxadev->routes[route_idx].output->output_standby; 1642 } else { 1643 in->output_standby_rec_thr = true; 1644 } 1645 1646 in->read_error_count = 0; 1647 // Initialize the pipe. 1648 ALOGV("adev_open_input_stream(): about to create pipe"); 1649 submix_audio_device_create_pipe_l(rsxadev, config, DEFAULT_PIPE_SIZE_IN_FRAMES, 1650 DEFAULT_PIPE_PERIOD_COUNT, in, NULL, address, route_idx); 1651#if LOG_STREAMS_TO_FILES 1652 if (in->log_fd >= 0) close(in->log_fd); 1653 in->log_fd = open(LOG_STREAM_IN_FILENAME, O_CREAT | O_TRUNC | O_WRONLY, 1654 LOG_STREAM_FILE_PERMISSIONS); 1655 ALOGE_IF(in->log_fd < 0, "adev_open_input_stream(): log file open failed %s", 1656 strerror(errno)); 1657 ALOGV("adev_open_input_stream(): log_fd = %d", in->log_fd); 1658#endif // LOG_STREAMS_TO_FILES 1659 // Return the input stream. 1660 *stream_in = &in->stream; 1661 1662 pthread_mutex_unlock(&rsxadev->lock); 1663 return 0; 1664} 1665 1666static void adev_close_input_stream(struct audio_hw_device *dev, 1667 struct audio_stream_in *stream) 1668{ 1669 struct submix_audio_device * const rsxadev = audio_hw_device_get_submix_audio_device(dev); 1670 1671 struct submix_stream_in * const in = audio_stream_in_get_submix_stream_in(stream); 1672 ALOGD("adev_close_input_stream()"); 1673 pthread_mutex_lock(&rsxadev->lock); 1674 submix_audio_device_destroy_pipe_l(rsxadev, in, NULL); 1675#if LOG_STREAMS_TO_FILES 1676 if (in->log_fd >= 0) close(in->log_fd); 1677#endif // LOG_STREAMS_TO_FILES 1678#if ENABLE_LEGACY_INPUT_OPEN 1679 if (in->ref_count == 0) free(in); 1680#else 1681 free(in); 1682#endif // ENABLE_LEGACY_INPUT_OPEN 1683 1684 pthread_mutex_unlock(&rsxadev->lock); 1685} 1686 1687static int adev_dump(const audio_hw_device_t *device, int fd) 1688{ 1689 const struct submix_audio_device * rsxadev = //audio_hw_device_get_submix_audio_device(device); 1690 reinterpret_cast<const struct submix_audio_device *>( 1691 reinterpret_cast<const uint8_t *>(device) - 1692 offsetof(struct submix_audio_device, device)); 1693 char msg[100]; 1694 int n = snprintf(msg, sizeof(msg), "\nReroute submix audio module:\n"); 1695 write(fd, &msg, n); 1696 for (int i=0 ; i < MAX_ROUTES ; i++) { 1697 n = snprintf(msg, sizeof(msg), " route[%d] rate in=%d out=%d, addr=[%s]\n", i, 1698 rsxadev->routes[i].config.input_sample_rate, 1699 rsxadev->routes[i].config.output_sample_rate, 1700 rsxadev->routes[i].address); 1701 write(fd, &msg, n); 1702 } 1703 return 0; 1704} 1705 1706static int adev_close(hw_device_t *device) 1707{ 1708 ALOGI("adev_close()"); 1709 free(device); 1710 return 0; 1711} 1712 1713static int adev_open(const hw_module_t* module, const char* name, 1714 hw_device_t** device) 1715{ 1716 ALOGI("adev_open(name=%s)", name); 1717 struct submix_audio_device *rsxadev; 1718 1719 if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) 1720 return -EINVAL; 1721 1722 rsxadev = (submix_audio_device*) calloc(1, sizeof(struct submix_audio_device)); 1723 if (!rsxadev) 1724 return -ENOMEM; 1725 1726 rsxadev->device.common.tag = HARDWARE_DEVICE_TAG; 1727 rsxadev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0; 1728 rsxadev->device.common.module = (struct hw_module_t *) module; 1729 rsxadev->device.common.close = adev_close; 1730 1731 rsxadev->device.init_check = adev_init_check; 1732 rsxadev->device.set_voice_volume = adev_set_voice_volume; 1733 rsxadev->device.set_master_volume = adev_set_master_volume; 1734 rsxadev->device.get_master_volume = adev_get_master_volume; 1735 rsxadev->device.set_master_mute = adev_set_master_mute; 1736 rsxadev->device.get_master_mute = adev_get_master_mute; 1737 rsxadev->device.set_mode = adev_set_mode; 1738 rsxadev->device.set_mic_mute = adev_set_mic_mute; 1739 rsxadev->device.get_mic_mute = adev_get_mic_mute; 1740 rsxadev->device.set_parameters = adev_set_parameters; 1741 rsxadev->device.get_parameters = adev_get_parameters; 1742 rsxadev->device.get_input_buffer_size = adev_get_input_buffer_size; 1743 rsxadev->device.open_output_stream = adev_open_output_stream; 1744 rsxadev->device.close_output_stream = adev_close_output_stream; 1745 rsxadev->device.open_input_stream = adev_open_input_stream; 1746 rsxadev->device.close_input_stream = adev_close_input_stream; 1747 rsxadev->device.dump = adev_dump; 1748 1749 for (int i=0 ; i < MAX_ROUTES ; i++) { 1750 memset(&rsxadev->routes[i], 0, sizeof(route_config)); 1751 strcpy(rsxadev->routes[i].address, ""); 1752 } 1753 1754 *device = &rsxadev->device.common; 1755 1756 return 0; 1757} 1758 1759static struct hw_module_methods_t hal_module_methods = { 1760 /* open */ adev_open, 1761}; 1762 1763struct audio_module HAL_MODULE_INFO_SYM = { 1764 /* common */ { 1765 /* tag */ HARDWARE_MODULE_TAG, 1766 /* module_api_version */ AUDIO_MODULE_API_VERSION_0_1, 1767 /* hal_api_version */ HARDWARE_HAL_API_VERSION, 1768 /* id */ AUDIO_HARDWARE_MODULE_ID, 1769 /* name */ "Wifi Display audio HAL", 1770 /* author */ "The Android Open Source Project", 1771 /* methods */ &hal_module_methods, 1772 /* dso */ NULL, 1773 /* reserved */ { 0 }, 1774 }, 1775}; 1776 1777} //namespace android 1778 1779} //extern "C" 1780