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

Commit 9c5c5a0d authored by Marco Nelissen's avatar Marco Nelissen Committed by Android (Google) Code Review
Browse files

Merge "Check buffer size after read" into qt-dev

parents 8b04b459 98be67ae
Loading
Loading
Loading
Loading
+9 −14
Original line number Original line Diff line number Diff line
@@ -505,45 +505,40 @@ media_status_t WAVSource::read(


    // TODO: add capability to return data as float PCM instead of 16 bit PCM.
    // TODO: add capability to return data as float PCM instead of 16 bit PCM.
    if (mWaveFormat == WAVE_FORMAT_PCM) {
    if (mWaveFormat == WAVE_FORMAT_PCM) {
        const size_t bytesPerFrame = (mBitsPerSample >> 3) * mNumChannels;
        const size_t numFrames = n / bytesPerFrame;
        const size_t numSamples = numFrames * mNumChannels;
        if (mOutputFloat) {
        if (mOutputFloat) {
            float *fdest = (float *)buffer->data();
            float *fdest = (float *)buffer->data();
            buffer->set_range(0, 4 * numSamples);
            switch (mBitsPerSample) {
            switch (mBitsPerSample) {
            case 8: {
            case 8: {
                buffer->set_range(0, 4 * n);
                memcpy_to_float_from_u8(fdest, (const uint8_t *)buffer->data(), numSamples);
                memcpy_to_float_from_u8(fdest, (const uint8_t *)buffer->data(), n);
            } break;
            } break;
            case 16: {
            case 16: {
                const size_t numSamples = n / 2;
                buffer->set_range(0, 4 * numSamples);
                memcpy_to_float_from_i16(fdest, (const int16_t *)buffer->data(), numSamples);
                memcpy_to_float_from_i16(fdest, (const int16_t *)buffer->data(), numSamples);
            } break;
            } break;
            case 24: {
            case 24: {
                const size_t numSamples = n / 3;
                buffer->set_range(0, 4 * numSamples);
                memcpy_to_float_from_p24(fdest, (const uint8_t *)buffer->data(), numSamples);
                memcpy_to_float_from_p24(fdest, (const uint8_t *)buffer->data(), numSamples);
            } break;
            } break;
            case 32: { // buffer range is correct
            case 32: { // buffer range is correct
                const size_t numSamples = n / 4;
                memcpy_to_float_from_i32(fdest, (const int32_t *)buffer->data(), numSamples);
                memcpy_to_float_from_i32(fdest, (const int32_t *)buffer->data(), numSamples);
            } break;
            } break;
            }
            }
        } else {
        } else {
            int16_t *idest = (int16_t *)buffer->data();
            int16_t *idest = (int16_t *)buffer->data();
            buffer->set_range(0, 2 * numSamples);
            switch (mBitsPerSample) {
            switch (mBitsPerSample) {
            case 8: {
            case 8: {
                buffer->set_range(0, 2 * n);
                memcpy_to_i16_from_u8(idest, (const uint8_t *)buffer->data(), numSamples);
                memcpy_to_i16_from_u8(idest, (const uint8_t *)buffer->data(), n);
            } break;
            } break;
            case 16:
            case 16:
                break; // no translation needed
                // no conversion needed
                break;
            case 24: {
            case 24: {
                const size_t numSamples = n / 3;
                buffer->set_range(0, 2 * numSamples);
                memcpy_to_i16_from_p24(idest, (const uint8_t *)buffer->data(), numSamples);
                memcpy_to_i16_from_p24(idest, (const uint8_t *)buffer->data(), numSamples);
            } break;
            } break;
            case 32: {
            case 32: {
                const size_t numSamples = n / 4;
                buffer->set_range(0, 2 * numSamples);
                memcpy_to_i16_from_i32(idest, (const int32_t *)buffer->data(), numSamples);
                memcpy_to_i16_from_i32(idest, (const int32_t *)buffer->data(), numSamples);
            } break;
            } break;
            }
            }