Merge changes from topics "adtFunctionsNoBitMask", "audioArraysStaticCheck", "mvSystemAudioTests", "rmDeviceTypeBitMaskUsage"
am: cc82581159
Change-Id: I8efd1d6d1d341253074aa22fc76409fe3efa540c
gugelfrei
commit
48a787c6fe
@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <map>
|
||||
|
||||
#include <system/audio.h>
|
||||
#include <utils/Log.h>
|
||||
#include <utils/String8.h>
|
||||
|
||||
#include "AudioPolicyTestClient.h"
|
||||
|
||||
namespace android {
|
||||
|
||||
class AudioPolicyManagerTestClient : public AudioPolicyTestClient {
|
||||
public:
|
||||
// AudioPolicyClientInterface implementation
|
||||
audio_module_handle_t loadHwModule(const char * /*name*/) override {
|
||||
return mNextModuleHandle++;
|
||||
}
|
||||
|
||||
status_t openOutput(audio_module_handle_t module,
|
||||
audio_io_handle_t *output,
|
||||
audio_config_t * /*config*/,
|
||||
audio_devices_t * /*devices*/,
|
||||
const String8 & /*address*/,
|
||||
uint32_t * /*latencyMs*/,
|
||||
audio_output_flags_t /*flags*/) override {
|
||||
if (module >= mNextModuleHandle) {
|
||||
ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
|
||||
__func__, module, mNextModuleHandle);
|
||||
return BAD_VALUE;
|
||||
}
|
||||
*output = mNextIoHandle++;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
audio_io_handle_t openDuplicateOutput(audio_io_handle_t /*output1*/,
|
||||
audio_io_handle_t /*output2*/) override {
|
||||
audio_io_handle_t id = mNextIoHandle++;
|
||||
return id;
|
||||
}
|
||||
|
||||
status_t openInput(audio_module_handle_t module,
|
||||
audio_io_handle_t *input,
|
||||
audio_config_t * /*config*/,
|
||||
audio_devices_t * /*device*/,
|
||||
const String8 & /*address*/,
|
||||
audio_source_t /*source*/,
|
||||
audio_input_flags_t /*flags*/) override {
|
||||
if (module >= mNextModuleHandle) {
|
||||
ALOGE("%s: Module handle %d has not been allocated yet (next is %d)",
|
||||
__func__, module, mNextModuleHandle);
|
||||
return BAD_VALUE;
|
||||
}
|
||||
*input = mNextIoHandle++;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
status_t createAudioPatch(const struct audio_patch *patch,
|
||||
audio_patch_handle_t *handle,
|
||||
int /*delayMs*/) override {
|
||||
*handle = mNextPatchHandle++;
|
||||
mActivePatches.insert(std::make_pair(*handle, *patch));
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
status_t releaseAudioPatch(audio_patch_handle_t handle,
|
||||
int /*delayMs*/) override {
|
||||
if (mActivePatches.erase(handle) != 1) {
|
||||
if (handle >= mNextPatchHandle) {
|
||||
ALOGE("%s: Patch handle %d has not been allocated yet (next is %d)",
|
||||
__func__, handle, mNextPatchHandle);
|
||||
} else {
|
||||
ALOGE("%s: Attempt to release patch %d twice", __func__, handle);
|
||||
}
|
||||
return BAD_VALUE;
|
||||
}
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
// Helper methods for tests
|
||||
size_t getActivePatchesCount() const { return mActivePatches.size(); }
|
||||
|
||||
const struct audio_patch *getLastAddedPatch() const {
|
||||
if (mActivePatches.empty()) {
|
||||
return nullptr;
|
||||
}
|
||||
auto it = --mActivePatches.end();
|
||||
return &it->second;
|
||||
};
|
||||
|
||||
private:
|
||||
audio_module_handle_t mNextModuleHandle = AUDIO_MODULE_HANDLE_NONE + 1;
|
||||
audio_io_handle_t mNextIoHandle = AUDIO_IO_HANDLE_NONE + 1;
|
||||
audio_patch_handle_t mNextPatchHandle = AUDIO_PATCH_HANDLE_NONE + 1;
|
||||
std::map<audio_patch_handle_t, struct audio_patch> mActivePatches;
|
||||
};
|
||||
|
||||
} // namespace android
|
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "AudioPolicy_Boot_Test"
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <media/AudioSystem.h>
|
||||
#include <system/audio.h>
|
||||
#include <utils/Log.h>
|
||||
|
||||
#include "AudioPolicyManagerTestClient.h"
|
||||
#include "AudioPolicyTestManager.h"
|
||||
|
||||
using namespace android;
|
||||
|
||||
TEST(AudioHealthTest, AttachedDeviceFound) {
|
||||
unsigned int numPorts;
|
||||
unsigned int generation1;
|
||||
unsigned int generation;
|
||||
struct audio_port *audioPorts = NULL;
|
||||
int attempts = 10;
|
||||
do {
|
||||
if (attempts-- < 0) {
|
||||
free(audioPorts);
|
||||
GTEST_FAIL() << "Query audio ports time out";
|
||||
}
|
||||
numPorts = 0;
|
||||
ASSERT_EQ(NO_ERROR, AudioSystem::listAudioPorts(
|
||||
AUDIO_PORT_ROLE_NONE, AUDIO_PORT_TYPE_DEVICE, &numPorts, NULL, &generation1));
|
||||
if (numPorts == 0) {
|
||||
free(audioPorts);
|
||||
GTEST_FAIL() << "Number of audio ports should not be zero";
|
||||
}
|
||||
|
||||
audioPorts = (struct audio_port *)realloc(audioPorts, numPorts * sizeof(struct audio_port));
|
||||
status_t status = AudioSystem::listAudioPorts(
|
||||
AUDIO_PORT_ROLE_NONE, AUDIO_PORT_TYPE_DEVICE, &numPorts, audioPorts, &generation);
|
||||
if (status != NO_ERROR) {
|
||||
free(audioPorts);
|
||||
GTEST_FAIL() << "Query audio ports failed";
|
||||
}
|
||||
} while (generation1 != generation);
|
||||
std::unordered_set<audio_devices_t> attachedDevices;
|
||||
for (int i = 0 ; i < numPorts; i++) {
|
||||
attachedDevices.insert(audioPorts[i].ext.device.type);
|
||||
}
|
||||
free(audioPorts);
|
||||
|
||||
AudioPolicyManagerTestClient client;
|
||||
AudioPolicyTestManager manager(&client);
|
||||
manager.loadConfig();
|
||||
ASSERT_NE("AudioPolicyConfig::setDefault", manager.getConfig().getSource());
|
||||
|
||||
for (auto desc : manager.getConfig().getAvailableInputDevices()) {
|
||||
ASSERT_NE(attachedDevices.end(), attachedDevices.find(desc->type()));
|
||||
}
|
||||
for (auto desc : manager.getConfig().getAvailableOutputDevices()) {
|
||||
ASSERT_NE(attachedDevices.end(), attachedDevices.find(desc->type()));
|
||||
}
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#define LOG_TAG "SysAudio_Test"
|
||||
#include <log/log.h>
|
||||
#include <media/PatchBuilder.h>
|
||||
#include <system/audio.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
TEST(SystemAudioTest, PatchInvalid) {
|
||||
audio_patch patch{};
|
||||
ASSERT_FALSE(audio_patch_is_valid(&patch));
|
||||
patch.num_sources = AUDIO_PATCH_PORTS_MAX + 1;
|
||||
patch.num_sinks = 1;
|
||||
ASSERT_FALSE(audio_patch_is_valid(&patch));
|
||||
patch.num_sources = 1;
|
||||
patch.num_sinks = AUDIO_PATCH_PORTS_MAX + 1;
|
||||
ASSERT_FALSE(audio_patch_is_valid(&patch));
|
||||
patch.num_sources = 0;
|
||||
patch.num_sinks = 1;
|
||||
ASSERT_FALSE(audio_patch_is_valid(&patch));
|
||||
}
|
||||
|
||||
TEST(SystemAudioTest, PatchValid) {
|
||||
const audio_port_config src = {
|
||||
.id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_DEVICE };
|
||||
// It's OK not to have sinks.
|
||||
ASSERT_TRUE(audio_patch_is_valid((PatchBuilder{}).addSource(src).patch()));
|
||||
const audio_port_config sink = {
|
||||
.id = 2, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_DEVICE };
|
||||
ASSERT_TRUE(audio_patch_is_valid((PatchBuilder{}).addSource(src).addSink(sink).patch()));
|
||||
ASSERT_TRUE(audio_patch_is_valid(
|
||||
(PatchBuilder{}).addSource(src).addSource(src).addSink(sink).patch()));
|
||||
ASSERT_TRUE(audio_patch_is_valid(
|
||||
(PatchBuilder{}).addSource(src).addSink(sink).addSink(sink).patch()));
|
||||
ASSERT_TRUE(audio_patch_is_valid(
|
||||
(PatchBuilder{}).addSource(src).addSource(src).
|
||||
addSink(sink).addSink(sink).patch()));
|
||||
}
|
||||
|
||||
TEST(SystemAudioTest, PatchHwAvSync) {
|
||||
audio_port_config device_src_cfg = {
|
||||
.id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_DEVICE };
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_src_cfg));
|
||||
device_src_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_src_cfg));
|
||||
device_src_cfg.flags.input = AUDIO_INPUT_FLAG_HW_AV_SYNC;
|
||||
ASSERT_TRUE(audio_port_config_has_hw_av_sync(&device_src_cfg));
|
||||
|
||||
audio_port_config device_sink_cfg = {
|
||||
.id = 1, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_DEVICE };
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_sink_cfg));
|
||||
device_sink_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&device_sink_cfg));
|
||||
device_sink_cfg.flags.output = AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
|
||||
ASSERT_TRUE(audio_port_config_has_hw_av_sync(&device_sink_cfg));
|
||||
|
||||
audio_port_config mix_sink_cfg = {
|
||||
.id = 1, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_MIX };
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_sink_cfg));
|
||||
mix_sink_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_sink_cfg));
|
||||
mix_sink_cfg.flags.input = AUDIO_INPUT_FLAG_HW_AV_SYNC;
|
||||
ASSERT_TRUE(audio_port_config_has_hw_av_sync(&mix_sink_cfg));
|
||||
|
||||
audio_port_config mix_src_cfg = {
|
||||
.id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_MIX };
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_src_cfg));
|
||||
mix_src_cfg.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
|
||||
ASSERT_FALSE(audio_port_config_has_hw_av_sync(&mix_src_cfg));
|
||||
mix_src_cfg.flags.output = AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
|
||||
ASSERT_TRUE(audio_port_config_has_hw_av_sync(&mix_src_cfg));
|
||||
}
|
||||
|
||||
TEST(SystemAudioTest, PatchEqual) {
|
||||
const audio_patch patch1{}, patch2{};
|
||||
// Invalid patches are not equal.
|
||||
ASSERT_FALSE(audio_patches_are_equal(&patch1, &patch2));
|
||||
const audio_port_config src = {
|
||||
.id = 1, .role = AUDIO_PORT_ROLE_SOURCE, .type = AUDIO_PORT_TYPE_DEVICE };
|
||||
const audio_port_config sink = {
|
||||
.id = 2, .role = AUDIO_PORT_ROLE_SINK, .type = AUDIO_PORT_TYPE_DEVICE };
|
||||
ASSERT_FALSE(audio_patches_are_equal(
|
||||
(PatchBuilder{}).addSource(src).patch(),
|
||||
(PatchBuilder{}).addSource(src).addSink(sink).patch()));
|
||||
ASSERT_TRUE(audio_patches_are_equal(
|
||||
(PatchBuilder{}).addSource(src).addSink(sink).patch(),
|
||||
(PatchBuilder{}).addSource(src).addSink(sink).patch()));
|
||||
ASSERT_FALSE(audio_patches_are_equal(
|
||||
(PatchBuilder{}).addSource(src).addSink(sink).patch(),
|
||||
(PatchBuilder{}).addSource(src).addSource(src).addSink(sink).patch()));
|
||||
audio_port_config sink_hw_av_sync = sink;
|
||||
sink_hw_av_sync.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
|
||||
sink_hw_av_sync.flags.output = AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
|
||||
ASSERT_FALSE(audio_patches_are_equal(
|
||||
(PatchBuilder{}).addSource(src).addSink(sink).patch(),
|
||||
(PatchBuilder{}).addSource(src).addSink(sink_hw_av_sync).patch()));
|
||||
ASSERT_TRUE(audio_patches_are_equal(
|
||||
(PatchBuilder{}).addSource(src).addSink(sink_hw_av_sync).patch(),
|
||||
(PatchBuilder{}).addSource(src).addSink(sink_hw_av_sync).patch()));
|
||||
}
|
Loading…
Reference in new issue