AudioFormatReader produces no sound

I’m trying to create a custom AudioFormatReader, then registered with AudioFormatManager. But when the audio is played, it has no sound. Here’s my implementation:

bool readSamples(int* const* destChannels, int numDestChannels, int startOffsetInDestBuffer,
                     int64 startSampleInFile, int numSamplesToRead) override {
        if (!codec || numDestChannels <= 0)
            return false;

        const int bytesPerSample = bitsPerSample / 8;
        const size_t bufferSize = numSamplesToRead * numChannels * bytesPerSample;
        std::vector<uint8_t> buffer(bufferSize);

        readAudioData(startSampleInFile, numSamplesToRead, buffer.data());

        // Convert interleaved audio buffer into per-channel buffer
        for (int sampleIdx = 0; sampleIdx < numSamplesToRead; ++sampleIdx)
        {
            for (int channel = 0; channel < numDestChannels; ++channel)
            {
                int sampleOffset = sampleIdx * numChannels + channel;
                destChannels[channel][startOffsetInDestBuffer + sampleIdx] = reinterpret_cast<int16_t*>(buffer.data())[sampleOffset];
            }
        }

        return true;
    }
bool readAudioData(int64 startSample, int numSamples, uint8_t* buffer)
    {
        AMediaExtractor_seekTo(extractor, startSample * 1000000 / sampleRate, AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC);
        int bytesRead = 0;

        while (bytesRead < numSamples)
        {
            ssize_t bufferIndex = AMediaCodec_dequeueInputBuffer(codec, 10000);
            if (bufferIndex >= 0)
            {
                size_t bufferSize;
                uint8_t* inputBuffer = AMediaCodec_getInputBuffer(codec, bufferIndex, &bufferSize);
                int sampleDataSize = AMediaExtractor_readSampleData(extractor, inputBuffer, bufferSize);

                if (sampleDataSize < 0)
                {
                    AMediaCodec_queueInputBuffer(codec, bufferIndex, 0, 0, 0, AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM);
                    break;
                }

                AMediaCodec_queueInputBuffer(codec, bufferIndex, 0, sampleDataSize, AMediaExtractor_getSampleTime(extractor), 0);
                AMediaExtractor_advance(extractor);
            }

            AMediaCodecBufferInfo bufferInfo;
            ssize_t outputBufferIndex = AMediaCodec_dequeueOutputBuffer(codec, &bufferInfo, 10000);

            if (outputBufferIndex >= 0)
            {
                size_t outputSize;
                uint8_t* outputBuffer = AMediaCodec_getOutputBuffer(codec, outputBufferIndex, &outputSize);

                size_t copySize = std::min(outputSize, (size_t)(numSamples - bytesRead) * numChannels * (bitsPerSample / 8));
                memcpy(buffer + bytesRead, outputBuffer, copySize);

                bytesRead += copySize;
                AMediaCodec_releaseOutputBuffer(codec, outputBufferIndex, false);
            }
        }

        return true;
    }

If there’s anything wrong, please let me know. Thanks

Anyone has experience in creating custom AudioFormatReader? It sounds strange but the destChannels doesn’t seem to be filled in other built-in reader (flac, ogg)