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

Commit d04c9ce1 authored by Phil Burk's avatar Phil Burk Committed by android-build-merger
Browse files

Merge "aaudio: add format option to example programs" into pi-dev

am: 32c74e9e

Change-Id: Ib08b73577bd05ad26aeada3d91770950284e6f55
parents 0ff41d1a 32c74e9e
Loading
Loading
Loading
Loading
+50 −36
Original line number Original line Diff line number Diff line
@@ -26,8 +26,6 @@
#include "AAudioExampleUtils.h"
#include "AAudioExampleUtils.h"
#include "AAudioSimpleRecorder.h"
#include "AAudioSimpleRecorder.h"


// TODO support FLOAT
#define REQUIRED_FORMAT    AAUDIO_FORMAT_PCM_I16
#define MIN_FRAMES_TO_READ 48  /* arbitrary, 1 msec at 48000 Hz */
#define MIN_FRAMES_TO_READ 48  /* arbitrary, 1 msec at 48000 Hz */


static const int FRAMES_PER_LINE = 20000;
static const int FRAMES_PER_LINE = 20000;
@@ -35,14 +33,15 @@ static const int FRAMES_PER_LINE = 20000;
int main(int argc, const char **argv)
int main(int argc, const char **argv)
{
{
    AAudioArgsParser      argParser;
    AAudioArgsParser      argParser;
    aaudio_result_t result;
    AAudioSimpleRecorder  recorder;
    AAudioSimpleRecorder  recorder;
    int actualSamplesPerFrame;
    int actualSampleRate;
    aaudio_format_t       actualDataFormat;

    AAudioStream         *aaudioStream = nullptr;
    AAudioStream         *aaudioStream = nullptr;

    aaudio_result_t       result;
    aaudio_format_t       actualDataFormat;
    aaudio_stream_state_t state;
    aaudio_stream_state_t state;

    int32_t actualSamplesPerFrame;
    int32_t actualSampleRate;
    int32_t framesPerBurst = 0;
    int32_t framesPerBurst = 0;
    int32_t framesPerRead = 0;
    int32_t framesPerRead = 0;
    int32_t framesToRecord = 0;
    int32_t framesToRecord = 0;
@@ -50,18 +49,18 @@ int main(int argc, const char **argv)
    int32_t nextFrameCount = 0;
    int32_t nextFrameCount = 0;
    int32_t frameCount = 0;
    int32_t frameCount = 0;
    int32_t xRunCount = 0;
    int32_t xRunCount = 0;
    int64_t previousFramePosition = -1;
    int16_t *data = nullptr;
    float peakLevel = 0.0;
    int32_t deviceId;
    int32_t deviceId;


    int16_t *shortData = nullptr;
    float   *floatData = nullptr;
    float    peakLevel = 0.0;

    // Make printf print immediately so that debug info is not stuck
    // Make printf print immediately so that debug info is not stuck
    // in a buffer if we hang or crash.
    // in a buffer if we hang or crash.
    setvbuf(stdout, nullptr, _IONBF, (size_t) 0);
    setvbuf(stdout, nullptr, _IONBF, (size_t) 0);


    printf("%s - Monitor input level using AAudio read, V0.1.2\n", argv[0]);
    printf("%s - Monitor input level using AAudio read, V0.1.3\n", argv[0]);


    argParser.setFormat(REQUIRED_FORMAT);
    if (argParser.parseArgs(argc, argv)) {
    if (argParser.parseArgs(argc, argv)) {
        return EXIT_FAILURE;
        return EXIT_FAILURE;
    }
    }
@@ -69,6 +68,7 @@ int main(int argc, const char **argv)
    result = recorder.open(argParser);
    result = recorder.open(argParser);
    if (result != AAUDIO_OK) {
    if (result != AAUDIO_OK) {
        fprintf(stderr, "ERROR -  recorder.open() returned %d\n", result);
        fprintf(stderr, "ERROR -  recorder.open() returned %d\n", result);
        printf("IMPORTANT - Did you remember to enter:   adb root\n");
        goto finish;
        goto finish;
    }
    }
    aaudioStream = recorder.getStream();
    aaudioStream = recorder.getStream();
@@ -96,16 +96,17 @@ int main(int argc, const char **argv)
    printf("DataFormat: framesPerRead  = %d\n",framesPerRead);
    printf("DataFormat: framesPerRead  = %d\n",framesPerRead);


    actualDataFormat = AAudioStream_getFormat(aaudioStream);
    actualDataFormat = AAudioStream_getFormat(aaudioStream);
    printf("DataFormat: requested      = %d, actual = %d\n",
           REQUIRED_FORMAT, actualDataFormat);
    // TODO handle other data formats
    assert(actualDataFormat == REQUIRED_FORMAT);


    // Allocate a buffer for the PCM_16 audio data.
    // Allocate a buffer for the PCM_16 audio data.
    data = new(std::nothrow) int16_t[framesPerRead * actualSamplesPerFrame];
    switch (actualDataFormat) {
    if (data == nullptr) {
        case AAUDIO_FORMAT_PCM_I16:
        fprintf(stderr, "ERROR - could not allocate data buffer\n");
            shortData = new int16_t[framesPerRead * actualSamplesPerFrame];
        result = AAUDIO_ERROR_NO_MEMORY;
            break;
        case AAUDIO_FORMAT_PCM_FLOAT:
            floatData = new float[framesPerRead * actualSamplesPerFrame];
            break;
        default:
            fprintf(stderr, "UNEXPECTED FORMAT! %d", actualDataFormat);
            goto finish;
            goto finish;
    }
    }


@@ -126,7 +127,12 @@ int main(int argc, const char **argv)
        // Read audio data from the stream.
        // Read audio data from the stream.
        const int64_t timeoutNanos = 1000 * NANOS_PER_MILLISECOND;
        const int64_t timeoutNanos = 1000 * NANOS_PER_MILLISECOND;
        int minFrames = (framesToRecord < framesPerRead) ? framesToRecord : framesPerRead;
        int minFrames = (framesToRecord < framesPerRead) ? framesToRecord : framesPerRead;
        int actual = AAudioStream_read(aaudioStream, data, minFrames, timeoutNanos);
        int actual = 0;
        if (actualDataFormat == AAUDIO_FORMAT_PCM_I16) {
            actual = AAudioStream_read(aaudioStream, shortData, minFrames, timeoutNanos);
        } else if (actualDataFormat == AAUDIO_FORMAT_PCM_FLOAT) {
            actual = AAudioStream_read(aaudioStream, floatData, minFrames, timeoutNanos);
        }
        if (actual < 0) {
        if (actual < 0) {
            fprintf(stderr, "ERROR - AAudioStream_read() returned %d\n", actual);
            fprintf(stderr, "ERROR - AAudioStream_read() returned %d\n", actual);
            result = actual;
            result = actual;
@@ -140,7 +146,12 @@ int main(int argc, const char **argv)


        // Peak finder.
        // Peak finder.
        for (int frameIndex = 0; frameIndex < actual; frameIndex++) {
        for (int frameIndex = 0; frameIndex < actual; frameIndex++) {
            float sample = data[frameIndex * actualSamplesPerFrame] * (1.0/32768);
            float sample = 0.0f;
            if (actualDataFormat == AAUDIO_FORMAT_PCM_I16) {
                sample = shortData[frameIndex * actualSamplesPerFrame] * (1.0/32768);
            } else if (actualDataFormat == AAUDIO_FORMAT_PCM_FLOAT) {
                sample = floatData[frameIndex * actualSamplesPerFrame];
            }
            if (sample > peakLevel) {
            if (sample > peakLevel) {
                peakLevel = sample;
                peakLevel = sample;
            }
            }
@@ -151,7 +162,6 @@ int main(int argc, const char **argv)
            displayPeakLevel(peakLevel);
            displayPeakLevel(peakLevel);
            peakLevel = 0.0;
            peakLevel = 0.0;
            nextFrameCount += FRAMES_PER_LINE;
            nextFrameCount += FRAMES_PER_LINE;
        }


            // Print timestamps.
            // Print timestamps.
            int64_t framePosition = 0;
            int64_t framePosition = 0;
@@ -161,7 +171,6 @@ int main(int argc, const char **argv)
                                                   &framePosition, &frameTime);
                                                   &framePosition, &frameTime);


            if (timeResult == AAUDIO_OK) {
            if (timeResult == AAUDIO_OK) {
            if (framePosition > (previousFramePosition + FRAMES_PER_LINE)) {
                int64_t realTime = getNanoseconds();
                int64_t realTime = getNanoseconds();
                int64_t framesRead = AAudioStream_getFramesRead(aaudioStream);
                int64_t framesRead = AAudioStream_getFramesRead(aaudioStream);


@@ -175,11 +184,15 @@ int main(int argc, const char **argv)
                       (long long) framePosition,
                       (long long) framePosition,
                       (long long) frameTime,
                       (long long) frameTime,
                       latencyMillis);
                       latencyMillis);
                previousFramePosition = framePosition;
            } else {
                printf("WARNING - AAudioStream_getTimestamp() returned %d\n", timeResult);
            }
            }
        }
        }
    }
    }


    state = AAudioStream_getState(aaudioStream);
    printf("after loop, state = %s\n", AAudio_convertStreamStateToText(state));

    xRunCount = AAudioStream_getXRunCount(aaudioStream);
    xRunCount = AAudioStream_getXRunCount(aaudioStream);
    printf("AAudioStream_getXRunCount %d\n", xRunCount);
    printf("AAudioStream_getXRunCount %d\n", xRunCount);


@@ -192,7 +205,8 @@ int main(int argc, const char **argv)


finish:
finish:
    recorder.close();
    recorder.close();
    delete[] data;
    delete[] shortData;
    delete[] floatData;
    printf("exiting - AAudio result = %d = %s\n", result, AAudio_convertResultToText(result));
    printf("exiting - AAudio result = %d = %s\n", result, AAudio_convertResultToText(result));
    return (result != AAUDIO_OK) ? EXIT_FAILURE : EXIT_SUCCESS;
    return (result != AAUDIO_OK) ? EXIT_FAILURE : EXIT_SUCCESS;
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,7 @@ int main(int argc, char **argv)
                       SimpleRecorderDataCallbackProc, SimpleRecorderErrorCallbackProc, &myData);
                       SimpleRecorderDataCallbackProc, SimpleRecorderErrorCallbackProc, &myData);
    if (result != AAUDIO_OK) {
    if (result != AAUDIO_OK) {
        fprintf(stderr, "ERROR -  recorder.open() returned %d\n", result);
        fprintf(stderr, "ERROR -  recorder.open() returned %d\n", result);
        printf("IMPORTANT - Did you remember to enter:   adb root\n");
        goto error;
        goto error;
    }
    }
    printf("recorder.getFramesPerSecond() = %d\n", recorder.getFramesPerSecond());
    printf("recorder.getFramesPerSecond() = %d\n", recorder.getFramesPerSecond());
+1 −2
Original line number Original line Diff line number Diff line
@@ -151,8 +151,7 @@ static aaudio_data_callback_result_t MyDataCallbackProc(
static void MyErrorCallbackProc(
static void MyErrorCallbackProc(
        AAudioStream *stream __unused,
        AAudioStream *stream __unused,
        void *userData __unused,
        void *userData __unused,
        aaudio_result_t error)
        aaudio_result_t error) {
{
    printf("Error Callback, error: %d\n",(int)error);
    printf("Error Callback, error: %d\n",(int)error);
    LoopbackData *myData = (LoopbackData *) userData;
    LoopbackData *myData = (LoopbackData *) userData;
    myData->outputError = error;
    myData->outputError = error;
+7 −1
Original line number Original line Diff line number Diff line
@@ -87,7 +87,6 @@ error:
    return;
    return;
}
}


// TODO use this as a base class within AAudio
class AAudioParameters {
class AAudioParameters {
public:
public:


@@ -262,6 +261,9 @@ public:
                case 'd':
                case 'd':
                    setDeviceId(atoi(&arg[2]));
                    setDeviceId(atoi(&arg[2]));
                    break;
                    break;
                case 'f':
                    setFormat(atoi(&arg[2]));
                    break;
                case 'i':
                case 'i':
                    setInputPreset(atoi(&arg[2]));
                    setInputPreset(atoi(&arg[2]));
                    break;
                    break;
@@ -326,6 +328,10 @@ public:
        printf("      -b{bufferCapacity} frames\n");
        printf("      -b{bufferCapacity} frames\n");
        printf("      -c{channels} for example 2 for stereo\n");
        printf("      -c{channels} for example 2 for stereo\n");
        printf("      -d{deviceId} default is %d\n", AAUDIO_UNSPECIFIED);
        printf("      -d{deviceId} default is %d\n", AAUDIO_UNSPECIFIED);
        printf("      -f{0|1|2} set format\n");
        printf("          0 = UNSPECIFIED\n");
        printf("          1 = PCM_I16\n");
        printf("          2 = FLOAT\n");
        printf("      -i{inputPreset} eg. 5 for AAUDIO_INPUT_PRESET_CAMCORDER\n");
        printf("      -i{inputPreset} eg. 5 for AAUDIO_INPUT_PRESET_CAMCORDER\n");
        printf("      -m{0|1|2|3} set MMAP policy\n");
        printf("      -m{0|1|2|3} set MMAP policy\n");
        printf("          0 = _UNSPECIFIED, use aaudio.mmap_policy system property, default\n");
        printf("          0 = _UNSPECIFIED, use aaudio.mmap_policy system property, default\n");
+1 −1
Original line number Original line Diff line number Diff line
@@ -57,7 +57,7 @@ int main(int argc, const char **argv)
    // in a buffer if we hang or crash.
    // in a buffer if we hang or crash.
    setvbuf(stdout, nullptr, _IONBF, (size_t) 0);
    setvbuf(stdout, nullptr, _IONBF, (size_t) 0);


    printf("%s - Play a sine wave using AAudio V0.1.2\n", argv[0]);
    printf("%s - Play a sine wave using AAudio V0.1.3\n", argv[0]);


    if (argParser.parseArgs(argc, argv)) {
    if (argParser.parseArgs(argc, argv)) {
        return EXIT_FAILURE;
        return EXIT_FAILURE;
Loading