Count number of frames that have been written, reset on standby.
The presentation position is the number of written frames minus
the frames still in the pipe (they were written but not presented).
Bug 21198864
Change-Id: I00ef10f56a825555e7a970cce1504a9bd3744e04
When reading from a pipe, the output may have been previously
closed, therefore the output state should only be read if it
is still available.
This fixes a race condition observed between in_read() (which
accesses the output stream) and adev_close_output_stream()
(which sets the output reference to NULL).
No issue with out_write() which checks the input reference.
Bug 16009464
Change-Id: I979bc12c8fe91fad9b6f6c9e0be107c1bacae360
The implementation for "remote submix" supported only one pipe
to capture the output of a mix.
This CL adds support for multiple pipes to support capturing
multiple audio routes.
The structure for the r_submix audio device holds an array
of route configurations (route_config), each referencing
the input and output of the pipe dedicated to this route.
Each route is associated to a unique address. Standby
status is maintained per stream.
Bug 16009464
Change-Id: Ie164c4ad2a6d8138f825484e7faf29a974ccf82e
The "remote submix" HAL uses a MonoPipe instance to "pipe" audio
from the sink of this virtual device HAL to its source.
The life-cycle of this pipe is:
- creation when either the input or output stream is open
- destruction when both input and output are closed.
Changes are:
Fix test for pipe destruction: destroy pipe when both
input and output streams are NULL.
Count how many read errors went into the logs and cap them
so as not to spam the logs when the pipe is not properly
set up. Less 'I' logs, 'D' logs instead.
When opening input stream, check for non-null sink before
checking if it's shutdown.
Bug 16653334
Bug 17111907
Change-Id: I634b4192b00f9b74a5109f42242423e9c8cb4c7c
Pass device address (and audio source for inputs) to
open_output_stream() and open_input_stream() audio HAL functions.
Bug: 14815883.
Change-Id: I5535677db3f3027917a31a7ed5c0a4c6bc013639
When channel conversion is enabled and the pipe is opened with less channels
(e.g 1) than the output stream's channels (e.g 2) the input stream's buffer
size was calculated incorrectly which resulted in the input stream buffer size
being larger than the output stream buffer size in terms of time. This
changes the pipe size to take into the account maximum frame size so the
output stream buffer size will be greater or equal to the input stream buffer
size.
In addition, if the pipe is created when the input stream is opened and the
output stream is opened at a different sample rate (e.g input = 8KHz,
output = 48Khz) the pipe will incorrectly rate limit writes to the pipe
resulting in gaps of silence in the data read from the pipe by the input
stream.
Bug: 15291446
Change-Id: I01480edff7ef3a199f509866c1e95ecd4c437a92
As described in If592270a17e08c5852b00b730bb9c5166c746ad2 the audio mixer
doesn't work correctly when sending data to an output device that supports
a sample rate that is more than 2x different to the source data rate.
This modifies the remote submix module to resample data from the pipe
when it's read from the input stream.
Bug: 11273000
Change-Id: I9c4b3710bcebf3a2df045965dfdafdd9855b0b25
In order to aid debugging of issues with streaming data in the submix HAL
this change introduces a compile time option to log the input and output
streams to files for offline inspection.
Bug: 11273000
Change-Id: Ib2d929d7ba66f63b719e6996df9016f73c9080aa
The AudioFlinger service currently will only open stereo streams from
mono AudioTracks since all mixing is performed in stereo and then sent
to the HAL stream. In order to allow a process to record a mono stream
from the submix HAL, this change implements channel conversion in
the submix HAL so that it's possible to open the output stream in stereo
and the input stream in mono.
Bug: 11273000
Change-Id: I840ce0be3cf7e5bc8a4c6de63a70d5408d60b716
Since it's possible to open an output stream on the submix HAL before the input
stream is open, writes to the output stream that fill the shared pipe result in
indefinitely blocking the thread writing to the stream. This change modifies
the behavior of writes to a submix output stream such that if a write would
result in blocking the thread and an input isn't open, the pipe is flushed
of the appropriate amount of data such that the write will not block.
Bug: 11273000
Change-Id: Ic81c50e4b44b777273191a1bc8cdf52181c3d2a0
This change is primarily being made as a short term solution to allow an input
audio stream received over the network to be fed into an audio input stream (e.g
the MIC stream) when a physical audio input device isn't present.
This makes both the input and output streams owners of the pipe so that
creation order no longer matters. In addition, it works around a memory leak
caused by applications that never close input streams.
Bug: 11273000
Change-Id: I5a3fb0b6f2148c113b2f3050b72ff2a8979a3e6d
This modifies the submix module to allow the internal buffer to be any NBAIO
format. This is useful when sending audio of arbitrary formats between
processes. AudioFlinger continues to enforce format restrictions as specified
by the device specific audio_policy.conf so the submix streams will have the
same restrictions as before.
Bug: 11273000
Change-Id: I2cd4ff383c5c75e491ab22bc1949c835f04e230f
This change stores the period size (fraction of the pipe buffer size)
in the submix device's configuration which is then used to calculate
the input and output stream buffer size.
In addition, accessors for the input / output stream format have been
modified to use the pipe format in the device configuration rather than
returning hard coded values.
Bug: 11273000
Change-Id: I9c14f8d549f4b4a6d7f77a9aeab4edfa5ba6bd1a
This change cleans up casting from contained to container structures.
Such that if..
struct child {
struct parent;
int child_data;
};
is changed to...
struct child {
int child_data;
struct parent;
};
functions that cast from "parent" to "child" will continue to function
correctly.
Change-Id: I88d70930d4d4df2e291239e562971b07d8b92f94
Along with the following minor changes:
* Fixed all referenced variable compiler warnings.
* Ordered headers in alphabetical order.
Change-Id: I122ef67d25b78056a60b85baf897005293a9efa0
Fix a few 64-bit warnings and set -Wno-unused-parameter, which makes
the directory warnings-clean on 32-bit and 64-bit.
Remove LOCAL_32_BIT_ONLY.
Change-Id: I6a2183b5bb0cdf438a04de967995da7b1e2e3854
Rely on strong pointers and scope rather than the more error prone
incStrong / decStrong approach which can cause object leaks.
No change in functionality.
Change-Id: I1bfc7f0cdeeac022e4120482cd3521e52ffea94e
Writing to the audio pipe for the remote submix is blocking, unless
the audio output pipe is in shutdown mode. The playback thread
could stay blocked on the write if the input stream has already
been closed.
The change consists in shutting down the pipe also when the input
stream gets closed. When the pipe is in this state, simulate
timing in the write operation so we don't drain the output faster
than realtime.
Bug 7424646
Change-Id: I5feb3be642b0ee7eef10dee0141308684ee9c811
Support receiving a parameter that sets the remote audio submix
module in a state where the audio pipe will unblock any current
write operation and not block anymore.
Change-Id: Ia3119cd79972afff0de24187dae627855a468ebf
The reference count on the strong pointers to the audio sink and
source should be done on the object retrieved from the device
structure, not by accessing the corresponding fields, as they
can be cleared while reading or writing audio data.
Change-Id: I446a2c7bdcb0758b4013b0ad75450a15203fb9da
Change how the remote audio submix is handling piping audio
through the pipe:
- use a MonoPipe as audio sink for blocking writes,
- use a MonoPipeReader as audio source for non blocking reads,
and keep track of when recording started to align the
time at which the in_read() call should return with the
projected time of the recording duration.
Change-Id: I8b0f8c56a0486806101e272dfbf9c6d2d1c11112
Neither write nor read are blocking, but write simulates
timing by checking the clock between two writes and
computing how long the next sleep should last.
Change-Id: I495ae6d44b0cf75a24fe4b70662cfac679049c67
New definitions of audio devices for remote submix: one representing
a sink for writing the audio buffers that won't be played directly
locally, another representing the audio source that can be read from
to obtain the audio mix.
New audio hardware module encapsulating the submix loop functionality.
Create a Pipe to serve as non-blocking audio ring buffer between
the output device (the sink) and the input device (the source).
Change-Id: I527f4721a69ced0430a99ebba3b4db7d419f2bb2