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

Commit 29b9eff4 authored by Eric Laurent's avatar Eric Laurent
Browse files

Improved unit test code for Audioflinger.

parent 3464c015
Loading
Loading
Loading
Loading
+92 −20
Original line number Diff line number Diff line
@@ -71,9 +71,21 @@ AudioStreamOut* AudioDumpInterface::openOutputStream(
            }
        }
    } else {
        if (format != 0 && *format != 0) lFormat = *format;
        if (channels != 0 && *channels != 0) lChannels = *channels;
        if (sampleRate != 0 && *sampleRate != 0) lRate = *sampleRate;
        if (format != 0 && *format != 0) {
            lFormat = *format;
        } else {
            lFormat = AudioSystem::PCM_16_BIT;
        }
        if (channels != 0 && *channels != 0) {
            lChannels = *channels;
        } else {
            lChannels = AudioSystem::CHANNEL_OUT_STEREO;
        }
        if (sampleRate != 0 && *sampleRate != 0) {
            lRate = *sampleRate;
        } else {
            lRate = 44100;
        }
        if (status) *status = NO_ERROR;
    }
    LOGV("openOutputStream(), outFinal %p", outFinal);
@@ -93,9 +105,13 @@ void AudioDumpInterface::closeOutputStream(AudioStreamOut* out)
        LOGW("Attempt to close invalid output stream");
        return;
    }

    LOGV("closeOutputStream() output %p", out);

    dumpOut->standby();
    if (dumpOut->finalStream() != NULL) {
        mFinalInterface->closeOutputStream(dumpOut->finalStream());
        mFirstHwOutput = true;
    }

    mOutputs.remove(dumpOut);
@@ -159,7 +175,7 @@ status_t AudioDumpInterface::setParameters(const String8& keyValuePairs)

    if (param.get(String8("test_cmd_file_name"), value) == NO_ERROR) {
        mFileName = value;
        return NO_ERROR;
        param.remove(String8("test_cmd_file_name"));
    }
    if (param.get(String8("test_cmd_policy"), value) == NO_ERROR) {
        Mutex::Autolock _l(mLock);
@@ -176,21 +192,35 @@ status_t AudioDumpInterface::setParameters(const String8& keyValuePairs)
String8 AudioDumpInterface::getParameters(const String8& keys)
{
    AudioParameter param = AudioParameter(keys);
    AudioParameter response;
    String8 value;

//    LOGV("getParameters %s", keys.string());

    if (param.get(String8("test_cmd_file_name"), value) == NO_ERROR) {
        return mFileName;
    }
    if (param.get(String8("test_cmd_policy"), value) == NO_ERROR) {
        Mutex::Autolock _l(mLock);
        if (mPolicyCommands.length() != 0) {
            response = AudioParameter(mPolicyCommands);
            response.addInt(String8("test_cmd_policy"), 1);
        } else {
            response.addInt(String8("test_cmd_policy"), 0);
        }
        param.remove(String8("test_cmd_policy"));
//        LOGV("test_cmd_policy command %s read", mPolicyCommands.string());
        return mPolicyCommands;
    }

    if (mFinalInterface != 0 ) return mFinalInterface->getParameters(keys);
    return String8("");
    if (param.get(String8("test_cmd_file_name"), value) == NO_ERROR) {
        response.add(String8("test_cmd_file_name"), mFileName);
        param.remove(String8("test_cmd_file_name"));
    }

    String8 keyValuePairs = response.toString();

    if (param.size() && mFinalInterface != 0 ) {
        keyValuePairs += ";";
        keyValuePairs += mFinalInterface->getParameters(param.toString());
    }

    return keyValuePairs;
}


@@ -213,6 +243,7 @@ AudioStreamOutDump::AudioStreamOutDump(AudioDumpInterface *interface,

AudioStreamOutDump::~AudioStreamOutDump()
{
    LOGV("AudioStreamOutDump destructor");
    Close();
}

@@ -283,15 +314,55 @@ status_t AudioStreamOutDump::setVolume(float left, float right)
}
status_t AudioStreamOutDump::setParameters(const String8& keyValuePairs)
{
    LOGV("AudioStreamOutDump::setParameters()");
    if (mFinalStream != 0 ) return mFinalStream->setParameters(keyValuePairs);
    return NO_ERROR;
    LOGV("AudioStreamOutDump::setParameters %s", keyValuePairs.string());

    if (mFinalStream != 0 ) {
        return mFinalStream->setParameters(keyValuePairs);
    }

    AudioParameter param = AudioParameter(keyValuePairs);
    String8 value;
    int valueInt;
    status_t status = NO_ERROR;

    if (param.getInt(String8("set_id"), valueInt) == NO_ERROR) {
        mId = valueInt;
    }

    if (param.getInt(String8("format"), valueInt) == NO_ERROR) {
        if (mOutFile == 0) {
            mFormat = valueInt;
        } else {
            status = INVALID_OPERATION;
        }
    }
    if (param.getInt(String8("channels"), valueInt) == NO_ERROR) {
        if (valueInt == AudioSystem::CHANNEL_OUT_STEREO || valueInt == AudioSystem::CHANNEL_OUT_MONO) {
            mChannels = valueInt;
        } else {
            status = BAD_VALUE;
        }
    }
    if (param.getInt(String8("sampling_rate"), valueInt) == NO_ERROR) {
        if (valueInt > 0 && valueInt <= 48000) {
            if (mOutFile == 0) {
                mSampleRate = valueInt;
            } else {
                status = INVALID_OPERATION;
            }
        } else {
            status = BAD_VALUE;
        }
    }
    return status;
}

String8 AudioStreamOutDump::getParameters(const String8& keys)
{
    String8 result = String8("");
    if (mFinalStream != 0 ) result = mFinalStream->getParameters(keys);
    return result;
    if (mFinalStream != 0 ) return mFinalStream->getParameters(keys);

    AudioParameter param = AudioParameter(keys);
    return param.toString();
}

status_t AudioStreamOutDump::dump(int fd, const Vector<String16>& args)
@@ -426,9 +497,10 @@ status_t AudioStreamInDump::setParameters(const String8& keyValuePairs)

String8 AudioStreamInDump::getParameters(const String8& keys)
{
    String8 result = String8("");
    if (mFinalStream != 0 ) result = mFinalStream->getParameters(keys);
    return result;
    if (mFinalStream != 0 ) return mFinalStream->getParameters(keys);

    AudioParameter param = AudioParameter(keys);
    return param.toString();
}

status_t AudioStreamInDump::dump(int fd, const Vector<String16>& args)
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ public:
    AudioStreamOut*     finalStream() { return mFinalStream; }
    uint32_t            device() { return mDevice; }

    int                 getId()  { return mId; }
private:
    AudioDumpInterface *mInterface;
    int                  mId;
+89 −16
Original line number Diff line number Diff line
@@ -197,8 +197,8 @@ audio_io_handle_t AudioPolicyManagerGeneric::getOutput(AudioSystem::stream_type

#ifdef AUDIO_POLICY_TEST
    if (mCurOutput != 0) {
        LOGV("getOutput() test output mCurOutput %d, samplingRate %d, format %d, channelcount %d, mDirectOutput %d",
                mCurOutput, mTestSamplingRate, mTestFormat, mTestChannelcount, mDirectOutput);
        LOGV("getOutput() test output mCurOutput %d, samplingRate %d, format %d, channels %x, mDirectOutput %d",
                mCurOutput, mTestSamplingRate, mTestFormat, mTestChannels, mDirectOutput);

        if (mTestOutputs[mCurOutput] == 0) {
            LOGV("getOutput() opening test output");
@@ -206,7 +206,7 @@ audio_io_handle_t AudioPolicyManagerGeneric::getOutput(AudioSystem::stream_type
            outputDesc->mDevice = mTestDevice;
            outputDesc->mSamplingRate = mTestSamplingRate;
            outputDesc->mFormat = mTestFormat;
            outputDesc->mChannels = (mTestChannelcount == 1) ? AudioSystem::CHANNEL_OUT_MONO : AudioSystem::CHANNEL_OUT_STEREO;
            outputDesc->mChannels = mTestChannels;
            outputDesc->mLatency = mTestLatencyMs;
            outputDesc->mFlags = (AudioSystem::output_flags)(mDirectOutput ? AudioSystem::OUTPUT_FLAG_DIRECT : 0);
            outputDesc->mRefCount[stream] = 0;
@@ -216,8 +216,13 @@ audio_io_handle_t AudioPolicyManagerGeneric::getOutput(AudioSystem::stream_type
                                            &outputDesc->mChannels,
                                            &outputDesc->mLatency,
                                            outputDesc->mFlags);
            if (mTestOutputs[mCurOutput]) {
                AudioParameter outputCmd = AudioParameter();
                outputCmd.addInt(String8("set_id"),mCurOutput);
                mpClientInterface->setParameters(mTestOutputs[mCurOutput],outputCmd.toString());
                mOutputs.add(mTestOutputs[mCurOutput], outputDesc);
            }
        }
        return mTestOutputs[mCurOutput];
    }
#endif //AUDIO_POLICY_TEST
@@ -495,10 +500,14 @@ AudioPolicyManagerGeneric::AudioPolicyManagerGeneric(AudioPolicyClientInterface
    }

#ifdef AUDIO_POLICY_TEST
    AudioParameter outputCmd = AudioParameter();
    outputCmd.addInt(String8("set_id"), 0);
    mpClientInterface->setParameters(mHardwareOutput, outputCmd.toString());

    mTestDevice = AudioSystem::DEVICE_OUT_SPEAKER;
    mTestSamplingRate = 44100;
    mTestFormat = AudioSystem::PCM_16_BIT;
    mTestChannelcount = 2;
    mTestChannels =  AudioSystem::CHANNEL_OUT_STEREO;
    mTestLatencyMs = 0;
    mCurOutput = 0;
    mDirectOutput = false;
@@ -537,15 +546,23 @@ bool AudioPolicyManagerGeneric::threadLoop()
    LOGV("entering threadLoop()");
    while (!exitPending())
    {
        String8 command;
        int valueInt;
        String8 value;

        Mutex::Autolock _l(mLock);
        mWaitWorkCV.waitRelative(mLock, milliseconds(50));
        String8 command;

        command = mpClientInterface->getParameters(0, String8("test_cmd_policy"));
        if (command != "") {
            LOGV("Test command %s received", command.string());
        AudioParameter param = AudioParameter(command);
            int valueInt;
            String8 value;

        if (param.getInt(String8("test_cmd_policy"), valueInt) == NO_ERROR &&
            valueInt != 0) {
            LOGV("Test command %s received", command.string());
            String8 target;
            if (param.get(String8("target"), target) != NO_ERROR) {
                target = "Manager";
            }
            if (param.getInt(String8("test_cmd_policy_output"), valueInt) == NO_ERROR) {
                param.remove(String8("test_cmd_policy_output"));
                mCurOutput = valueInt;
@@ -565,28 +582,84 @@ bool AudioPolicyManagerGeneric::threadLoop()

            if (param.get(String8("test_cmd_policy_format"), value) == NO_ERROR) {
                param.remove(String8("test_cmd_policy_format"));
                int format = AudioSystem::INVALID_FORMAT;
                if (value == "PCM 16 bits") {
                    mTestFormat = AudioSystem::PCM_16_BIT;
                    format = AudioSystem::PCM_16_BIT;
                } else if (value == "PCM 8 bits") {
                    mTestFormat = AudioSystem::PCM_8_BIT;
                    format = AudioSystem::PCM_8_BIT;
                } else if (value == "Compressed MP3") {
                    mTestFormat = AudioSystem::MP3;
                    format = AudioSystem::MP3;
                }
                if (format != AudioSystem::INVALID_FORMAT) {
                    if (target == "Manager") {
                        mTestFormat = format;
                    } else if (mTestOutputs[mCurOutput] != 0) {
                        AudioParameter outputParam = AudioParameter();
                        outputParam.addInt(String8("format"), format);
                        mpClientInterface->setParameters(mTestOutputs[mCurOutput], outputParam.toString());
                    }
                }
            }
            if (param.get(String8("test_cmd_policy_channels"), value) == NO_ERROR) {
                param.remove(String8("test_cmd_policy_channels"));
                int channels = 0;

                if (value == "Channels Stereo") {
                    mTestChannelcount = 2;
                    channels =  AudioSystem::CHANNEL_OUT_STEREO;
                } else if (value == "Channels Mono") {
                    mTestChannelcount = 1;
                    channels =  AudioSystem::CHANNEL_OUT_MONO;
                }
                if (channels != 0) {
                    if (target == "Manager") {
                        mTestChannels = channels;
                    } else if (mTestOutputs[mCurOutput] != 0) {
                        AudioParameter outputParam = AudioParameter();
                        outputParam.addInt(String8("channels"), channels);
                        mpClientInterface->setParameters(mTestOutputs[mCurOutput], outputParam.toString());
                    }
                }
            }
            if (param.getInt(String8("test_cmd_policy_sampleRate"), valueInt) == NO_ERROR) {
                param.remove(String8("test_cmd_policy_sampleRate"));
                if (valueInt >= 0 && valueInt <= 96000) {
                    mTestSamplingRate = valueInt;
                    int samplingRate = valueInt;
                    if (target == "Manager") {
                        mTestSamplingRate = samplingRate;
                    } else if (mTestOutputs[mCurOutput] != 0) {
                        AudioParameter outputParam = AudioParameter();
                        outputParam.addInt(String8("sampling_rate"), samplingRate);
                        mpClientInterface->setParameters(mTestOutputs[mCurOutput], outputParam.toString());
                    }
                }
            }

            if (param.get(String8("test_cmd_policy_reopen"), value) == NO_ERROR) {
                param.remove(String8("test_cmd_policy_reopen"));

                mpClientInterface->closeOutput(mHardwareOutput);
                delete mOutputs.valueFor(mHardwareOutput);
                mOutputs.removeItem(mHardwareOutput);

                AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor();
                outputDesc->mDevice = (uint32_t)AudioSystem::DEVICE_OUT_SPEAKER;
                mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
                                                &outputDesc->mSamplingRate,
                                                &outputDesc->mFormat,
                                                &outputDesc->mChannels,
                                                &outputDesc->mLatency,
                                                outputDesc->mFlags);
                if (mHardwareOutput == 0) {
                    LOGE("Failed to reopen hardware output stream, samplingRate: %d, format %d, channels %d",
                            outputDesc->mSamplingRate, outputDesc->mFormat, outputDesc->mChannels);
                } else {
                    AudioParameter outputCmd = AudioParameter();
                    outputCmd.addInt(String8("set_id"), 0);
                    mpClientInterface->setParameters(mHardwareOutput, outputCmd.toString());
                    mOutputs.add(mHardwareOutput, outputDesc);
                }
            }


            mpClientInterface->setParameters(0, String8("test_cmd_policy="));
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -180,7 +180,7 @@ private:
        uint32_t        mTestDevice;
        uint32_t        mTestSamplingRate;
        uint32_t        mTestFormat;
        uint32_t        mTestChannelcount;
        uint32_t        mTestChannels;
        uint32_t        mTestLatencyMs;
#endif //AUDIO_POLICY_TEST