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

Commit 043150c8 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

release-request-051da47e-713f-4e09-8f6c-698fb4d4e92e-for-git_oc-dr1-release-39...

release-request-051da47e-713f-4e09-8f6c-698fb4d4e92e-for-git_oc-dr1-release-3997165 snap-temp-L04400000062809322

Change-Id: I3b6a8b8db24c312dd5866823048139fb55b33442
parents 35430080 2f35206b
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -294,12 +294,21 @@ public:

    std::string toString() const {
        std::stringstream ss;
        ss << "mInterpolatorType: " << static_cast<int32_t>(mInterpolatorType) << std::endl;
        ss << "mFirstSlope: " << mFirstSlope << std::endl;
        ss << "mLastSlope: " << mLastSlope << std::endl;
        ss << "Interpolator{mInterpolatorType=" << static_cast<int32_t>(mInterpolatorType);
        ss << ", mFirstSlope=" << mFirstSlope;
        ss << ", mLastSlope=" << mLastSlope;
        ss << ", {";
        bool first = true;
        for (const auto &pt : *this) {
            ss << pt.first << " " << pt.second << std::endl;
            if (first) {
                first = false;
                ss << "{";
            } else {
                ss << ", {";
            }
            ss << pt.first << ", " << pt.second << "}";
        }
        ss << "}}";
        return ss.str();
    }

@@ -324,7 +333,7 @@ private:

    // spline cubic polynomial coefficient cache
    std::unordered_map<S, std::tuple<S /* c1 */, S /* c2 */, S /* c3 */>> mMemo;
};
}; // Interpolator

} // namespace android

+354 −192

File changed.

Preview size limit exceeded, changes collapsed.

+63 −24
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@
#include <time.h>
#include <aaudio/AAudio.h>

#define NUM_SECONDS           10
#define NUM_SECONDS           5
#define NANOS_PER_MICROSECOND ((int64_t)1000)
#define NANOS_PER_MILLISECOND (NANOS_PER_MICROSECOND * 1000)
#define NANOS_PER_SECOND      (NANOS_PER_MILLISECOND * 1000)
@@ -33,13 +33,13 @@
#define SHARING_MODE  AAUDIO_SHARING_MODE_SHARED

/**
 * Simple wrapper for AAudio that opens a default stream and then calls
 * a callback function to fill the output buffers.
 * Simple wrapper for AAudio that opens an input stream and then calls
 * a callback function to process the input data.
 */
class SimpleAAudioPlayer {
class SimpleAAudioRecorder {
public:
    SimpleAAudioPlayer() {}
    ~SimpleAAudioPlayer() {
    SimpleAAudioRecorder() {}
    ~SimpleAAudioRecorder() {
        close();
    };

@@ -71,6 +71,15 @@ public:
        }
        return AAudioStream_getSamplesPerFrame(mStream);;
    }
    /**
     * Only call this after open() has been called.
     */
    int64_t getFramesRead() {
        if (mStream == nullptr) {
            return AAUDIO_ERROR_INVALID_STATE;
        }
        return AAudioStream_getFramesRead(mStream);;
    }

    /**
     * Open a stream
@@ -85,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_I16);
        AAudioStreamBuilder_setFormat(mBuilder, AAUDIO_FORMAT_PCM_FLOAT);

        // Open an AAudioStream using the Builder.
        result = AAudioStreamBuilder_openStream(mBuilder, &mStream);
@@ -121,11 +130,10 @@ public:
    }

    // Write zero data to fill up the buffer and prevent underruns.
    // Assume format is PCM_I16. TODO use floats.
    aaudio_result_t prime() {
        int32_t samplesPerFrame = AAudioStream_getSamplesPerFrame(mStream);
        const int numFrames = 32; // arbitrary
        int16_t zeros[numFrames * samplesPerFrame];
        float zeros[numFrames * samplesPerFrame];
        memset(zeros, 0, sizeof(zeros));
        aaudio_result_t result = numFrames;
        while (result == numFrames) {
@@ -151,8 +159,16 @@ public:
            fprintf(stderr, "ERROR - AAudioStream_requestStop() returned %d %s\n",
                    result, AAudio_convertResultToText(result));
        }
        int32_t xRunCount = AAudioStream_getXRunCount(mStream);
        printf("AAudioStream_getXRunCount %d\n", xRunCount);
        return result;
    }

    // Pause the stream. AAudio will stop calling your callback function.
    aaudio_result_t pause() {
        aaudio_result_t result = AAudioStream_requestPause(mStream);
        if (result != AAUDIO_OK) {
            fprintf(stderr, "ERROR - AAudioStream_requestPause() returned %d %s\n",
                    result, AAudio_convertResultToText(result));
        }
        return result;
    }

@@ -227,7 +243,7 @@ void displayPeakLevel(float peakLevel) {
int main(int argc, char **argv)
{
    (void)argc; // unused
    SimpleAAudioPlayer player;
    SimpleAAudioRecorder recorder;
    PeakTrackerData_t myData = {0.0};
    aaudio_result_t result;
    const int displayRateHz = 20; // arbitrary
@@ -238,37 +254,60 @@ int main(int argc, char **argv)
    setvbuf(stdout, nullptr, _IONBF, (size_t) 0);
    printf("%s - Display audio input using an AAudio callback\n", argv[0]);

    player.setSharingMode(SHARING_MODE);
    recorder.setSharingMode(SHARING_MODE);

    result = recorder.open(MyDataCallbackProc, &myData);
    if (result != AAUDIO_OK) {
        fprintf(stderr, "ERROR -  recorder.open() returned %d\n", result);
        goto error;
    }
    printf("recorder.getFramesPerSecond() = %d\n", recorder.getFramesPerSecond());
    printf("recorder.getSamplesPerFrame() = %d\n", recorder.getSamplesPerFrame());

    result = player.open(MyDataCallbackProc, &myData);
    result = recorder.start();
    if (result != AAUDIO_OK) {
        fprintf(stderr, "ERROR -  player.open() returned %d\n", result);
        fprintf(stderr, "ERROR -  recorder.start() returned %d\n", result);
        goto error;
    }
    printf("player.getFramesPerSecond() = %d\n", player.getFramesPerSecond());
    printf("player.getSamplesPerFrame() = %d\n", player.getSamplesPerFrame());

    result = player.start();
    printf("Sleep for %d seconds while audio record in a callback thread.\n", NUM_SECONDS);
    for (int i = 0; i < loopsNeeded; i++)
    {
        const struct timespec request = { .tv_sec = 0,
                .tv_nsec = NANOS_PER_SECOND / displayRateHz };
        (void) clock_nanosleep(CLOCK_MONOTONIC, 0 /*flags*/, &request, NULL /*remain*/);
        printf("%08d: ", (int)recorder.getFramesRead());
        displayPeakLevel(myData.peakLevel);
    }
    printf("Woke up. Stop for a moment.\n");

    result = recorder.stop();
    if (result != AAUDIO_OK) {
        goto error;
    }
    sleep(1);
    result = recorder.start();
    if (result != AAUDIO_OK) {
        fprintf(stderr, "ERROR -  player.start() returned %d\n", result);
        fprintf(stderr, "ERROR -  recorder.start() returned %d\n", result);
        goto error;
    }

    printf("Sleep for %d seconds while audio plays in a callback thread.\n", NUM_SECONDS);
    printf("Sleep for %d seconds while audio records in a callback thread.\n", NUM_SECONDS);
    for (int i = 0; i < loopsNeeded; i++)
    {
        const struct timespec request = { .tv_sec = 0,
                .tv_nsec = NANOS_PER_SECOND / displayRateHz };
        (void) clock_nanosleep(CLOCK_MONOTONIC, 0 /*flags*/, &request, NULL /*remain*/);
        printf("%08d: ", (int)recorder.getFramesRead());
        displayPeakLevel(myData.peakLevel);
    }
    printf("Woke up now.\n");

    result = player.stop();
    result = recorder.stop();
    if (result != AAUDIO_OK) {
        goto error;
    }
    result = player.close();
    result = recorder.close();
    if (result != AAUDIO_OK) {
        goto error;
    }
@@ -276,7 +315,7 @@ int main(int argc, char **argv)
    printf("SUCCESS\n");
    return EXIT_SUCCESS;
error:
    player.close();
    recorder.close();
    printf("exiting - AAudio result = %d = %s\n", result, AAudio_convertResultToText(result));
    return EXIT_FAILURE;
}
+8 −0
Original line number Diff line number Diff line
@@ -507,6 +507,9 @@ AAUDIO_API aaudio_result_t AAudioStream_requestStart(AAudioStream* stream);
 * Use AAudioStream_Start() to resume playback after a pause.
 * After this call the state will be in AAUDIO_STREAM_STATE_PAUSING or AAUDIO_STREAM_STATE_PAUSED.
 *
 * This will return AAUDIO_ERROR_UNIMPLEMENTED for input streams.
 * For input streams use AAudioStream_requestStop().
 *
 * @param stream reference provided by AAudioStreamBuilder_openStream()
 * @return AAUDIO_OK or a negative error.
 */
@@ -519,6 +522,8 @@ AAUDIO_API aaudio_result_t AAudioStream_requestPause(AAudioStream* stream);
 * Frame counters are not reset by a flush. They may be advanced.
 * After this call the state will be in AAUDIO_STREAM_STATE_FLUSHING or AAUDIO_STREAM_STATE_FLUSHED.
 *
 * This will return AAUDIO_ERROR_UNIMPLEMENTED for input streams.
 *
 * @param stream reference provided by AAudioStreamBuilder_openStream()
 * @return AAUDIO_OK or a negative error.
 */
@@ -704,6 +709,9 @@ AAUDIO_API int32_t AAudioStream_getFramesPerDataCallback(AAudioStream* stream);
 *
 * An underrun or overrun can cause an audible "pop" or "glitch".
 *
 * Note that some INPUT devices may not support this function.
 * In that case a 0 will always be returned.
 *
 * @param stream reference provided by AAudioStreamBuilder_openStream()
 * @return the underrun or overrun count
 */
+13 −4
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ status_t SharedMemoryParcelable::writeToParcel(Parcel* parcel) const {
    if (status != NO_ERROR) return status;
    if (mSizeInBytes > 0) {
        status = parcel->writeDupFileDescriptor(mFd);
        ALOGE_IF(status != NO_ERROR, "SharedMemoryParcelable writeDupFileDescriptor failed : %d", status);
        ALOGE_IF(status != NO_ERROR, "SharedMemoryParcelable writeDupFileDescriptor failed : %d",
                 status);
    }
    return status;
}
@@ -61,11 +62,13 @@ status_t SharedMemoryParcelable::readFromParcel(const Parcel* parcel) {
        return status;
    }
    if (mSizeInBytes > 0) {
        int originalFD = parcel->readFileDescriptor();
        mFd = fcntl(originalFD, F_DUPFD_CLOEXEC, 0);
        mOriginalFd = parcel->readFileDescriptor();
        ALOGV("SharedMemoryParcelable::readFromParcel() LEAK? mOriginalFd = %d\n", mOriginalFd);
        mFd = fcntl(mOriginalFd, F_DUPFD_CLOEXEC, 0);
        ALOGV("SharedMemoryParcelable::readFromParcel() LEAK? mFd = %d\n", mFd);
        if (mFd == -1) {
            status = -errno;
            ALOGE("SharedMemoryParcelable readFileDescriptor fcntl() failed : %d", status);
            ALOGE("SharedMemoryParcelable readFromParcel fcntl() failed : %d", status);
        }
    }
    return status;
@@ -81,9 +84,15 @@ aaudio_result_t SharedMemoryParcelable::close() {
        mResolvedAddress = MMAP_UNRESOLVED_ADDRESS;
    }
    if (mFd != -1) {
        ALOGV("SharedMemoryParcelable::close() LEAK? mFd = %d\n", mFd);
        ::close(mFd);
        mFd = -1;
    }
    if (mOriginalFd != -1) {
        ALOGV("SharedMemoryParcelable::close() LEAK? mOriginalFd = %d\n", mOriginalFd);
        ::close(mOriginalFd);
        mOriginalFd = -1;
    }
    return AAUDIO_OK;
}

Loading