1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "effectcontrol_fuzzer.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_ci#include <cstdlib> 19094332d3Sopenharmony_ci#include "v1_0/effect_types.h" 20094332d3Sopenharmony_ci#include "v1_0/ieffect_control.h" 21094332d3Sopenharmony_ci#include "v1_0/ieffect_model.h" 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_ciusing namespace std; 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cinamespace OHOS { 26094332d3Sopenharmony_cinamespace Audio { 27094332d3Sopenharmony_ciconstexpr int32_t OFFSET = 4; 28094332d3Sopenharmony_ciconstexpr size_t THRESHOLD = 10; 29094332d3Sopenharmony_ciconstexpr uint32_t GET_BUFFER_LEN = 10; 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_cienum EffectControlCmdId { 32094332d3Sopenharmony_ci EFFECT_CONTROL_EFFECT_PROCESS, 33094332d3Sopenharmony_ci EFFECT_CONTROL_SEND_COMMAND, 34094332d3Sopenharmony_ci EFFECT_CONTROL_GET_DESCRIPTOR, 35094332d3Sopenharmony_ci EFFECT_CONTROL_EFFECT_REVERSE, 36094332d3Sopenharmony_ci}; 37094332d3Sopenharmony_ci 38094332d3Sopenharmony_cistatic uint32_t Convert2Uint32(const uint8_t *ptr) 39094332d3Sopenharmony_ci{ 40094332d3Sopenharmony_ci if (ptr == nullptr) { 41094332d3Sopenharmony_ci return 0; 42094332d3Sopenharmony_ci } 43094332d3Sopenharmony_ci /* 44094332d3Sopenharmony_ci * Move the 0th digit 24 to the left, the first digit 16 to the left, the second digit 8 to the left, 45094332d3Sopenharmony_ci * and the third digit no left 46094332d3Sopenharmony_ci */ 47094332d3Sopenharmony_ci return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]); 48094332d3Sopenharmony_ci} 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_civoid EffectControlFucSwitch(struct IEffectControl *&controller, uint32_t cmd, const uint8_t *&rawData, size_t size) 51094332d3Sopenharmony_ci{ 52094332d3Sopenharmony_ci uint8_t *data = const_cast<uint8_t *>(rawData); 53094332d3Sopenharmony_ci switch (cmd) { 54094332d3Sopenharmony_ci case EFFECT_CONTROL_EFFECT_PROCESS: { 55094332d3Sopenharmony_ci struct AudioEffectBuffer output = {0}; 56094332d3Sopenharmony_ci controller->EffectProcess(controller, reinterpret_cast<AudioEffectBuffer *>(data), &output); 57094332d3Sopenharmony_ci break; 58094332d3Sopenharmony_ci } 59094332d3Sopenharmony_ci case EFFECT_CONTROL_SEND_COMMAND: { 60094332d3Sopenharmony_ci int8_t output[GET_BUFFER_LEN] = {0}; 61094332d3Sopenharmony_ci uint32_t replyLen = GET_BUFFER_LEN; 62094332d3Sopenharmony_ci controller->SendCommand(controller, (*data) % AUDIO_EFFECT_COMMAND_GET_PARAM, 63094332d3Sopenharmony_ci reinterpret_cast<int8_t *>(data), size, output, &replyLen); 64094332d3Sopenharmony_ci break; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci case EFFECT_CONTROL_GET_DESCRIPTOR: { 67094332d3Sopenharmony_ci struct EffectControllerDescriptor desc; 68094332d3Sopenharmony_ci controller->GetEffectDescriptor(controller, &desc); 69094332d3Sopenharmony_ci break; 70094332d3Sopenharmony_ci } 71094332d3Sopenharmony_ci case EFFECT_CONTROL_EFFECT_REVERSE: { 72094332d3Sopenharmony_ci struct AudioEffectBuffer output = {0}; 73094332d3Sopenharmony_ci controller->EffectReverse(controller, reinterpret_cast<struct AudioEffectBuffer *>(data), &output); 74094332d3Sopenharmony_ci break; 75094332d3Sopenharmony_ci } 76094332d3Sopenharmony_ci default: 77094332d3Sopenharmony_ci return; 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci} 80094332d3Sopenharmony_ci 81094332d3Sopenharmony_cibool DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size) 82094332d3Sopenharmony_ci{ 83094332d3Sopenharmony_ci if (rawData == nullptr) { 84094332d3Sopenharmony_ci return false; 85094332d3Sopenharmony_ci } 86094332d3Sopenharmony_ci uint32_t cmd = Convert2Uint32(rawData) % EFFECT_CONTROL_EFFECT_REVERSE; 87094332d3Sopenharmony_ci rawData = rawData + OFFSET; 88094332d3Sopenharmony_ci 89094332d3Sopenharmony_ci struct IEffectModel *model = IEffectModelGet(true); 90094332d3Sopenharmony_ci if (model == nullptr) { 91094332d3Sopenharmony_ci return false; 92094332d3Sopenharmony_ci } 93094332d3Sopenharmony_ci 94094332d3Sopenharmony_ci char *libName = strdup("libmock_effect_lib"); 95094332d3Sopenharmony_ci char *effectId = strdup("aaaabbbb-8888-9999-6666-aabbccdd9966ff"); 96094332d3Sopenharmony_ci struct EffectInfo info = { 97094332d3Sopenharmony_ci .libName = libName, 98094332d3Sopenharmony_ci .effectId = effectId, 99094332d3Sopenharmony_ci .ioDirection = 1, 100094332d3Sopenharmony_ci }; 101094332d3Sopenharmony_ci struct IEffectControl *controller = nullptr; 102094332d3Sopenharmony_ci struct ControllerId contollerId; 103094332d3Sopenharmony_ci 104094332d3Sopenharmony_ci int32_t ret = model->CreateEffectController(model, &info, &controller, &contollerId); 105094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 106094332d3Sopenharmony_ci return false; 107094332d3Sopenharmony_ci } 108094332d3Sopenharmony_ci if (controller == nullptr) { 109094332d3Sopenharmony_ci return false; 110094332d3Sopenharmony_ci } 111094332d3Sopenharmony_ci 112094332d3Sopenharmony_ci EffectControlFucSwitch(controller, cmd, rawData, size); 113094332d3Sopenharmony_ci 114094332d3Sopenharmony_ci if (libName != nullptr) { 115094332d3Sopenharmony_ci free(libName); 116094332d3Sopenharmony_ci libName = nullptr; 117094332d3Sopenharmony_ci } 118094332d3Sopenharmony_ci if (effectId != nullptr) { 119094332d3Sopenharmony_ci free(effectId); 120094332d3Sopenharmony_ci effectId = nullptr; 121094332d3Sopenharmony_ci } 122094332d3Sopenharmony_ci 123094332d3Sopenharmony_ci ret = model->DestroyEffectController(model, &contollerId); 124094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 125094332d3Sopenharmony_ci return false; 126094332d3Sopenharmony_ci } 127094332d3Sopenharmony_ci IEffectModelRelease(model, true); 128094332d3Sopenharmony_ci return true; 129094332d3Sopenharmony_ci} 130094332d3Sopenharmony_ci} 131094332d3Sopenharmony_ci} 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 134094332d3Sopenharmony_ci{ 135094332d3Sopenharmony_ci if (size < OHOS::Audio::THRESHOLD) { 136094332d3Sopenharmony_ci return 0; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci OHOS::Audio::DoSomethingInterestingWithMyAPI(data, size); 139094332d3Sopenharmony_ci return 0; 140094332d3Sopenharmony_ci}