From 4135fa4e590cd9cd24da0976a66a609cd838c383 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Wed, 11 Dec 2019 15:50:51 -0800 Subject: [PATCH] audio: Ignore ENOSYS from optional legacy HAL methods Some methods of legacy HALs are optional. The legacy HAL can avoid implementing them either by setting the function entry in the interface table to NULL or by setting it to a stub function returning -ENOSYS. In the latter case the default implementation was spamming syslog with warnings. Specify that ENOSYS returned from optional legacy HAL methods must be ignored. Bug: 141989952 Test: check logcat Change-Id: Idbdff8d88e3303a0181cb5629ab82485148e6d8e --- audio/core/all-versions/default/Device.cpp | 17 +++++---- audio/core/all-versions/default/StreamOut.cpp | 36 +++++++++++-------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/audio/core/all-versions/default/Device.cpp b/audio/core/all-versions/default/Device.cpp index 21dab00387..c6c9464656 100644 --- a/audio/core/all-versions/default/Device.cpp +++ b/audio/core/all-versions/default/Device.cpp @@ -84,26 +84,29 @@ Return Device::setMasterVolume(float volume) { ALOGW("Can not set a master volume (%f) outside [0,1]", volume); return Result::INVALID_ARGUMENTS; } - return analyzeStatus("set_master_volume", mDevice->set_master_volume(mDevice, volume)); + return analyzeStatus("set_master_volume", mDevice->set_master_volume(mDevice, volume), + {ENOSYS} /*ignore*/); } Return Device::getMasterVolume(getMasterVolume_cb _hidl_cb) { Result retval(Result::NOT_SUPPORTED); float volume = 0; if (mDevice->get_master_volume != NULL) { - retval = analyzeStatus("get_master_volume", mDevice->get_master_volume(mDevice, &volume)); + retval = analyzeStatus("get_master_volume", mDevice->get_master_volume(mDevice, &volume), + {ENOSYS} /*ignore*/); } _hidl_cb(retval, volume); return Void(); } Return Device::setMicMute(bool mute) { - return analyzeStatus("set_mic_mute", mDevice->set_mic_mute(mDevice, mute)); + return analyzeStatus("set_mic_mute", mDevice->set_mic_mute(mDevice, mute), {ENOSYS} /*ignore*/); } Return Device::getMicMute(getMicMute_cb _hidl_cb) { bool mute = false; - Result retval = analyzeStatus("get_mic_mute", mDevice->get_mic_mute(mDevice, &mute)); + Result retval = analyzeStatus("get_mic_mute", mDevice->get_mic_mute(mDevice, &mute), + {ENOSYS} /*ignore*/); _hidl_cb(retval, mute); return Void(); } @@ -111,7 +114,8 @@ Return Device::getMicMute(getMicMute_cb _hidl_cb) { Return Device::setMasterMute(bool mute) { Result retval(Result::NOT_SUPPORTED); if (mDevice->set_master_mute != NULL) { - retval = analyzeStatus("set_master_mute", mDevice->set_master_mute(mDevice, mute)); + retval = analyzeStatus("set_master_mute", mDevice->set_master_mute(mDevice, mute), + {ENOSYS} /*ignore*/); } return retval; } @@ -120,7 +124,8 @@ Return Device::getMasterMute(getMasterMute_cb _hidl_cb) { Result retval(Result::NOT_SUPPORTED); bool mute = false; if (mDevice->get_master_mute != NULL) { - retval = analyzeStatus("get_master_mute", mDevice->get_master_mute(mDevice, &mute)); + retval = analyzeStatus("get_master_mute", mDevice->get_master_mute(mDevice, &mute), + {ENOSYS} /*ignore*/); } _hidl_cb(retval, mute); return Void(); diff --git a/audio/core/all-versions/default/StreamOut.cpp b/audio/core/all-versions/default/StreamOut.cpp index 396d354179..1a2a764297 100644 --- a/audio/core/all-versions/default/StreamOut.cpp +++ b/audio/core/all-versions/default/StreamOut.cpp @@ -318,7 +318,8 @@ Return StreamOut::setVolume(float left, float right) { ALOGW("Can not set a stream output volume {%f, %f} outside [0,1]", left, right); return Result::INVALID_ARGUMENTS; } - return Stream::analyzeStatus("set_volume", mStream->set_volume(mStream, left, right)); + return Stream::analyzeStatus("set_volume", mStream->set_volume(mStream, left, right), + {ENOSYS} /*ignore*/); } Return StreamOut::prepareForWriting(uint32_t frameSize, uint32_t framesCount, @@ -403,7 +404,8 @@ Return StreamOut::prepareForWriting(uint32_t frameSize, uint32_t framesCou Return StreamOut::getRenderPosition(getRenderPosition_cb _hidl_cb) { uint32_t halDspFrames; Result retval = Stream::analyzeStatus("get_render_position", - mStream->get_render_position(mStream, &halDspFrames)); + mStream->get_render_position(mStream, &halDspFrames), + {ENOSYS} /*ignore*/); _hidl_cb(retval, halDspFrames); return Void(); } @@ -413,7 +415,8 @@ Return StreamOut::getNextWriteTimestamp(getNextWriteTimestamp_cb _hidl_cb) int64_t timestampUs = 0; if (mStream->get_next_write_timestamp != NULL) { retval = Stream::analyzeStatus("get_next_write_timestamp", - mStream->get_next_write_timestamp(mStream, ×tampUs)); + mStream->get_next_write_timestamp(mStream, ×tampUs), + {ENOSYS} /*ignore*/); } _hidl_cb(retval, timestampUs); return Void(); @@ -427,7 +430,7 @@ Return StreamOut::setCallback(const sp& callback) { if (result == 0) { mCallback = callback; } - return Stream::analyzeStatus("set_callback", result); + return Stream::analyzeStatus("set_callback", result, {ENOSYS} /*ignore*/); } Return StreamOut::clearCallback() { @@ -473,13 +476,15 @@ Return StreamOut::supportsPauseAndResume(supportsPauseAndResume_cb _hidl_c } Return StreamOut::pause() { - return mStream->pause != NULL ? Stream::analyzeStatus("pause", mStream->pause(mStream)) - : Result::NOT_SUPPORTED; + return mStream->pause != NULL + ? Stream::analyzeStatus("pause", mStream->pause(mStream), {ENOSYS} /*ignore*/) + : Result::NOT_SUPPORTED; } Return StreamOut::resume() { - return mStream->resume != NULL ? Stream::analyzeStatus("resume", mStream->resume(mStream)) - : Result::NOT_SUPPORTED; + return mStream->resume != NULL + ? Stream::analyzeStatus("resume", mStream->resume(mStream), {ENOSYS} /*ignore*/) + : Result::NOT_SUPPORTED; } Return StreamOut::supportsDrain() { @@ -488,14 +493,17 @@ Return StreamOut::supportsDrain() { Return StreamOut::drain(AudioDrain type) { return mStream->drain != NULL - ? Stream::analyzeStatus( - "drain", mStream->drain(mStream, static_cast(type))) - : Result::NOT_SUPPORTED; + ? Stream::analyzeStatus( + "drain", + mStream->drain(mStream, static_cast(type)), + {ENOSYS} /*ignore*/) + : Result::NOT_SUPPORTED; } Return StreamOut::flush() { - return mStream->flush != NULL ? Stream::analyzeStatus("flush", mStream->flush(mStream)) - : Result::NOT_SUPPORTED; + return mStream->flush != NULL + ? Stream::analyzeStatus("flush", mStream->flush(mStream), {ENOSYS} /*ignore*/) + : Result::NOT_SUPPORTED; } // static @@ -505,7 +513,7 @@ Result StreamOut::getPresentationPositionImpl(audio_stream_out_t* stream, uint64 // to return it sometimes. EAGAIN may be returned by A2DP audio HAL // implementation. ENODATA can also be reported while the writer is // continuously querying it, but the stream has been stopped. - static const std::vector ignoredErrors{EINVAL, EAGAIN, ENODATA}; + static const std::vector ignoredErrors{EINVAL, EAGAIN, ENODATA, ENOSYS}; Result retval(Result::NOT_SUPPORTED); if (stream->get_presentation_position == NULL) return retval; struct timespec halTimeStamp;