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

Commit 23c8cf95 authored by Glenn Kasten's avatar Glenn Kasten Committed by Android (Google) Code Review
Browse files

Merge "Restore the ability to build tee sink for debugging" into lmp-dev

parents 453d633b 329f6511
Loading
Loading
Loading
Loading
+14 −10
Original line number Original line Diff line number Diff line
@@ -1941,9 +1941,8 @@ sp<AudioFlinger::RecordThread> AudioFlinger::openInput_l(audio_module_handle_t m
            TEE_SINK_NEW,   // copy input using a new pipe
            TEE_SINK_NEW,   // copy input using a new pipe
            TEE_SINK_OLD,   // copy input using an existing pipe
            TEE_SINK_OLD,   // copy input using an existing pipe
        } kind;
        } kind;
        NBAIO_Format format = Format_from_SR_C(inStream->common.get_sample_rate(&inStream->common),
        NBAIO_Format format = Format_from_SR_C(halconfig.sample_rate,
                audio_channel_count_from_in_mask(
                audio_channel_count_from_in_mask(halconfig.channel_mask), halconfig.format);
                        inStream->common.get_channels(&inStream->common)));
        if (!mTeeSinkInputEnabled) {
        if (!mTeeSinkInputEnabled) {
            kind = TEE_SINK_NO;
            kind = TEE_SINK_NO;
        } else if (!Format_isValid(format)) {
        } else if (!Format_isValid(format)) {
@@ -2700,24 +2699,26 @@ void AudioFlinger::dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_hand
        // if 2 dumpsys are done within 1 second, and rotation didn't work, then discard 2nd
        // if 2 dumpsys are done within 1 second, and rotation didn't work, then discard 2nd
        int teeFd = open(teePath, O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW, S_IRUSR | S_IWUSR);
        int teeFd = open(teePath, O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW, S_IRUSR | S_IWUSR);
        if (teeFd >= 0) {
        if (teeFd >= 0) {
            // FIXME use libsndfile
            char wavHeader[44];
            char wavHeader[44];
            memcpy(wavHeader,
            memcpy(wavHeader,
                "RIFF\0\0\0\0WAVEfmt \20\0\0\0\1\0\2\0\104\254\0\0\0\0\0\0\4\0\20\0data\0\0\0\0",
                "RIFF\0\0\0\0WAVEfmt \20\0\0\0\1\0\2\0\104\254\0\0\0\0\0\0\4\0\20\0data\0\0\0\0",
                sizeof(wavHeader));
                sizeof(wavHeader));
            NBAIO_Format format = teeSource->format();
            NBAIO_Format format = teeSource->format();
            unsigned channelCount = Format_channelCount(format);
            unsigned channelCount = Format_channelCount(format);
            ALOG_ASSERT(channelCount <= FCC_2);
            uint32_t sampleRate = Format_sampleRate(format);
            uint32_t sampleRate = Format_sampleRate(format);
            size_t frameSize = Format_frameSize(format);
            wavHeader[22] = channelCount;       // number of channels
            wavHeader[22] = channelCount;       // number of channels
            wavHeader[24] = sampleRate;         // sample rate
            wavHeader[24] = sampleRate;         // sample rate
            wavHeader[25] = sampleRate >> 8;
            wavHeader[25] = sampleRate >> 8;
            wavHeader[32] = channelCount * 2;   // block alignment
            wavHeader[32] = frameSize;          // block alignment
            wavHeader[33] = frameSize >> 8;
            write(teeFd, wavHeader, sizeof(wavHeader));
            write(teeFd, wavHeader, sizeof(wavHeader));
            size_t total = 0;
            size_t total = 0;
            bool firstRead = true;
            bool firstRead = true;
#define TEE_SINK_READ 1024                      // frames per I/O operation
            void *buffer = malloc(TEE_SINK_READ * frameSize);
            for (;;) {
            for (;;) {
#define TEE_SINK_READ 1024
                short buffer[TEE_SINK_READ * FCC_2];
                size_t count = TEE_SINK_READ;
                size_t count = TEE_SINK_READ;
                ssize_t actual = teeSource->read(buffer, count,
                ssize_t actual = teeSource->read(buffer, count,
                        AudioBufferProvider::kInvalidPTS);
                        AudioBufferProvider::kInvalidPTS);
@@ -2730,14 +2731,17 @@ void AudioFlinger::dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_hand
                    break;
                    break;
                }
                }
                ALOG_ASSERT(actual <= (ssize_t)count);
                ALOG_ASSERT(actual <= (ssize_t)count);
                write(teeFd, buffer, actual * channelCount * sizeof(short));
                write(teeFd, buffer, actual * frameSize);
                total += actual;
                total += actual;
            }
            }
            free(buffer);
            lseek(teeFd, (off_t) 4, SEEK_SET);
            lseek(teeFd, (off_t) 4, SEEK_SET);
            uint32_t temp = 44 + total * channelCount * sizeof(short) - 8;
            uint32_t temp = 44 + total * frameSize - 8;
            // FIXME not big-endian safe
            write(teeFd, &temp, sizeof(temp));
            write(teeFd, &temp, sizeof(temp));
            lseek(teeFd, (off_t) 40, SEEK_SET);
            lseek(teeFd, (off_t) 40, SEEK_SET);
            temp =  total * channelCount * sizeof(short);
            temp =  total * frameSize;
            // FIXME not big-endian safe
            write(teeFd, &temp, sizeof(temp));
            write(teeFd, &temp, sizeof(temp));
            close(teeFd);
            close(teeFd);
            if (fd >= 0) {
            if (fd >= 0) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -420,7 +420,7 @@ void FastMixer::onWork()
        // if non-NULL, then duplicate write() to this non-blocking sink
        // if non-NULL, then duplicate write() to this non-blocking sink
        NBAIO_Sink* teeSink;
        NBAIO_Sink* teeSink;
        if ((teeSink = current->mTeeSink) != NULL) {
        if ((teeSink = current->mTeeSink) != NULL) {
            (void) teeSink->write(mMixerBuffer, frameCount);
            (void) teeSink->write(buffer, frameCount);
        }
        }
        // FIXME write() is non-blocking and lock-free for a properly implemented NBAIO sink,
        // FIXME write() is non-blocking and lock-free for a properly implemented NBAIO sink,
        //       but this code should be modified to handle both non-blocking and blocking sinks
        //       but this code should be modified to handle both non-blocking and blocking sinks
+1 −1
Original line number Original line Diff line number Diff line
@@ -182,7 +182,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(


#ifdef TEE_SINK
#ifdef TEE_SINK
        if (mTeeSinkTrackEnabled) {
        if (mTeeSinkTrackEnabled) {
            NBAIO_Format pipeFormat = Format_from_SR_C(mSampleRate, mChannelCount);
            NBAIO_Format pipeFormat = Format_from_SR_C(mSampleRate, mChannelCount, mFormat);
            if (Format_isValid(pipeFormat)) {
            if (Format_isValid(pipeFormat)) {
                Pipe *pipe = new Pipe(mTeeSinkTrackFrames, pipeFormat);
                Pipe *pipe = new Pipe(mTeeSinkTrackFrames, pipeFormat);
                size_t numCounterOffers = 0;
                size_t numCounterOffers = 0;