Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 433ecd85 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "aaudio: lower latency using MMAP capture" into oc-dev

parents f9637d63 87c9f646
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -24,12 +24,11 @@
#include <aaudio/AAudio.h>

#define SAMPLE_RATE           48000
#define NUM_SECONDS        10
#define NUM_SECONDS           6
#define NANOS_PER_MICROSECOND ((int64_t)1000)
#define NANOS_PER_MILLISECOND (NANOS_PER_MICROSECOND * 1000)
#define NANOS_PER_SECOND      (NANOS_PER_MILLISECOND * 1000)

#define DECAY_FACTOR       0.999
#define MIN_FRAMES_TO_READ    48  /* arbitrary, 1 msec at 48000 Hz */

static const char *getSharingModeText(aaudio_sharing_mode_t mode) {
@@ -59,6 +58,7 @@ int main(int argc, char **argv)
    aaudio_audio_format_t actualDataFormat;

    const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_SHARED;
    //const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_EXCLUSIVE;
    aaudio_sharing_mode_t actualSharingMode;

    AAudioStreamBuilder *aaudioBuilder = nullptr;
@@ -143,27 +143,27 @@ int main(int argc, char **argv)
    state = AAudioStream_getState(aaudioStream);
    printf("after start, state = %s\n", AAudio_convertStreamStateToText(state));

    // Play for a while.
    // Record for a while.
    framesToRecord = actualSampleRate * NUM_SECONDS;
    framesLeft = framesToRecord;
    while (framesLeft > 0) {
        // Read audio data from the stream.
        int64_t timeoutNanos = 100 * NANOS_PER_MILLISECOND;
        const int64_t timeoutNanos = 100 * NANOS_PER_MILLISECOND;
        int minFrames = (framesToRecord < framesPerRead) ? framesToRecord : framesPerRead;
        int actual = AAudioStream_read(aaudioStream, data, minFrames, timeoutNanos);
        if (actual < 0) {
            fprintf(stderr, "ERROR - AAudioStream_read() returned %zd\n", actual);
            fprintf(stderr, "ERROR - AAudioStream_read() returned %d\n", actual);
            result = actual;
            goto finish;
        } else if (actual == 0) {
            fprintf(stderr, "WARNING - AAudioStream_read() returned %zd\n", actual);
            fprintf(stderr, "WARNING - AAudioStream_read() returned %d\n", actual);
            goto finish;
        }
        framesLeft -= actual;

        // Peak follower.
        // Peak finder.
        for (int frameIndex = 0; frameIndex < actual; frameIndex++) {
            float sample = data[frameIndex * actualSamplesPerFrame] * (1.0/32768);
            peakLevel *= DECAY_FACTOR;
            if (sample > peakLevel) {
                peakLevel = sample;
            }
@@ -177,6 +177,7 @@ int main(int argc, char **argv)
                printf("*");
            }
            printf("\n");
            peakLevel = 0.0;
        }
    }

@@ -184,9 +185,9 @@ int main(int argc, char **argv)
    printf("AAudioStream_getXRunCount %d\n", xRunCount);

finish:
    delete[] data;
    AAudioStream_close(aaudioStream);
    AAudioStreamBuilder_delete(aaudioBuilder);
    delete[] data;
    printf("exiting - AAudio result = %d = %s\n", result, AAudio_convertResultToText(result));
    return (result != AAUDIO_OK) ? EXIT_FAILURE : EXIT_SUCCESS;
}
+4 −4
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ public:
        AAudioStreamBuilder_setDirection(mBuilder, AAUDIO_DIRECTION_INPUT);
        AAudioStreamBuilder_setSharingMode(mBuilder, mRequestedSharingMode);
        AAudioStreamBuilder_setDataCallback(mBuilder, proc, userContext);
        AAudioStreamBuilder_setFormat(mBuilder, AAUDIO_FORMAT_PCM_FLOAT);
        AAudioStreamBuilder_setFormat(mBuilder, AAUDIO_FORMAT_PCM_I16);

        // Open an AAudioStream using the Builder.
        result = AAudioStreamBuilder_openStream(mBuilder, &mStream);
@@ -285,7 +285,7 @@ int main(int argc, char **argv)
    if (result != AAUDIO_OK) {
        goto error;
    }
    sleep(1);
    usleep(2000 * 1000);
    result = recorder.start();
    if (result != AAUDIO_OK) {
        fprintf(stderr, "ERROR -  recorder.start() returned %d\n", result);
+2 −2
Original line number Diff line number Diff line
@@ -344,8 +344,8 @@ int main(int argc, const char **argv)
    aaudio_audio_format_t actualInputFormat;
    aaudio_audio_format_t actualOutputFormat;

    //const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_EXCLUSIVE;
    const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_SHARED;
    const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_EXCLUSIVE;
    //const aaudio_sharing_mode_t requestedSharingMode = AAUDIO_SHARING_MODE_SHARED;
    aaudio_sharing_mode_t       actualSharingMode;

    AAudioStreamBuilder  *builder = nullptr;
+4 −0
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ LOCAL_SRC_FILES = \
    fifo/FifoControllerBase.cpp \
    client/AudioEndpoint.cpp \
    client/AudioStreamInternal.cpp \
    client/AudioStreamInternalCapture.cpp \
    client/AudioStreamInternalPlay.cpp \
    client/IsochronousClockModel.cpp \
    binding/AudioEndpointParcelable.cpp \
    binding/AAudioBinderClient.cpp \
@@ -99,6 +101,8 @@ LOCAL_SRC_FILES = core/AudioStream.cpp \
    fifo/FifoControllerBase.cpp \
    client/AudioEndpoint.cpp \
    client/AudioStreamInternal.cpp \
    client/AudioStreamInternalCapture.cpp \
    client/AudioStreamInternalPlay.cpp \
    client/IsochronousClockModel.cpp \
    binding/AudioEndpointParcelable.cpp \
    binding/AAudioBinderClient.cpp \
+1 −2
Original line number Diff line number Diff line
@@ -77,8 +77,7 @@ typedef struct EndpointDescriptor_s {
    // Set capacityInFrames to zero if Queue is unused.
    RingBufferDescriptor upMessageQueueDescriptor;   // server to client
    RingBufferDescriptor downMessageQueueDescriptor; // client to server
    RingBufferDescriptor upDataQueueDescriptor;      // eg. record
    RingBufferDescriptor downDataQueueDescriptor;    // eg. playback
    RingBufferDescriptor dataQueueDescriptor;    // playback or capture
} EndpointDescriptor;

} // namespace aaudio
Loading