/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * 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.
 */

package OHOS.AudioStandard;

import AudioServiceTypes;
sequenceable OHOS.IRemoteObject;
sequenceable audio_info..OHOS.AudioStandard.AudioPlaybackCaptureConfig;
sequenceable audio_info..OHOS.AudioStandard.AudioProcessConfig;
sequenceable audio_info..OHOS.AudioStandard.RestoreInfoIpc;
sequenceable audio_info..OHOS.AudioStandard.SinkInput;
sequenceable audio_effect..OHOS.AudioStandard.Library;
sequenceable audio_effect..OHOS.AudioStandard.Effect;
sequenceable audio_effect..OHOS.AudioStandard.EffectChain;
sequenceable audio_effect..OHOS.AudioStandard.EffectChainManagerParam;
sequenceable audio_effect..OHOS.AudioStandard.AudioSpatializationState;
sequenceable audio_effect..OHOS.AudioStandard.AudioEffectPropertyArray;
sequenceable hdi_adapter_type..OHOS.AudioStandard.IAudioSinkAttr;
sequenceable hdi_adapter_type..OHOS.AudioStandard.IAudioSourceAttr;
sequenceable audio_stutter..OHOS.AudioStandard.DataTransferMonitorParam;
sequenceable audio_interrupt_info..OHOS.AudioStandard.InterruptEventInternal;
sequenceable audio_engine_callback_types..OHOS.AudioStandard.AudioOutputPipeInfo;
sequenceable audio_engine_callback_types..OHOS.AudioStandard.AudioInputPipeInfo;
sequenceable audio_capturer_types..OHOS.AudioStandard.AudioWakeupTrackInfo;

interface IStandardAudioService {
    [ipccode 0] void GetAudioParameter([in] String key, [out] String value);
    void SetAudioParameter([in] String key, [in] String value);
    void GetExtraParameters([in] String mainKey, [in] List<String> subKyes, [out] List<StringPair> parameters);
    void SetExtraParameters([in] String key, [in] List<StringPair> kvpairs);
    void SetMicrophoneMute([in] boolean isMute);
    void SetAudioScene([in] int audioScene, [in] int a2dpOffloadFlag, [in] boolean scoExcludeFlag, [in] int phoneCallSceneType);
    void UpdateActiveDevicesRoute([in] List<IntPair> activeDevices, [in] int a2dpOffloadFlag, [in] unsigned int pipeId, [in] String networkId);
    void UpdateDualToneState([in] boolean enable, [in] int sessionId, [in] String dupSinkName);
    void SetParameterCallback([in] IRemoteObject object);
    void GetAudioParameter([in] String networkId, [in] int key, [in] String condition, [out] String value);
    void SetAudioParameter([in] String networkId, [in] int key, [in] String condition, [in] String value);
    void NotifyDeviceInfo([in] String networkId, [in] boolean connected);
    void NotifyTaskIdProxy([in] String taskId, [in] boolean connected);
    void CheckRemoteDeviceState([in] String networkId, [in] int deviceRole, [in] boolean isStartDevice);
    void SetVoiceVolume([in] float volume);
    void SetAudioMonoState([in] boolean audioMono);
    void SetAudioBalanceValue([in] float audioBalance);
    void CreateAudioProcess([in] AudioProcessConfig config, [out] int errorCode, [in] AudioPlaybackCaptureConfig filterConfig, [out] IRemoteObject client);
    void LoadAudioEffectLibraries([in] List<Library> libraries, [in] List<Effect> effects, [out] List<Effect> successEffects, [out] boolean hasEffectsLoaded);
    void CreateEffectChainManager([in] List<EffectChain> effectChains, [in] EffectChainManagerParam effectParam, [in] EffectChainManagerParam enhanceParam);
    void SetOutputDeviceSink([in] int device, [in] String sinkName);
    void SetActiveOutputDevice([in] int deviceType);
    void CreatePlaybackCapturerManager([out] boolean isSuccess);
    [oneway] void RegiestPolicyProvider([in] IRemoteObject object);
    [oneway] void RegistCoreServiceProvider([in] IRemoteObject object);
    void SetWakeupSourceCallback([in] IRemoteObject object);
    void UpdateSpatializationState([in] AudioSpatializationState spatializationState);
    void UpdateSpatialDeviceType([in] int spatialDeviceType);
    void OffloadSetVolume([in] float volume, [in] unsigned int renderId);
    void NotifyStreamVolumeChanged([in] int streamType, [in] float volume);
    void SetSpatializationSceneType([in] int spatializationSceneType);
    void GetMaxAmplitude([in] boolean isOutputDevice, [in] String deviceClass, [in] int sourceType, [out] float maxAmplitude);
    void ResetRouteForDisconnect([in] int type);
    void GetEffectLatency([in] String sessionId, [out] unsigned int latency);
    void UpdateLatencyTimestamp([in] String timestamp, [in] boolean isRenderer);
    void SetAsrAecMode([in] int asrAecMode); // AsrAecMode asrAecMode
    void GetAsrAecMode([out] int asrAecMode); // AsrAecMode asrAecMode
    void SetAsrNoiseSuppressionMode([in] int asrNoiseSuppressionMode); // AsrNoiseSuppressionMode asrNoiseSuppressionMode
    void SetOffloadMode([in] unsigned int sessionId, [in] int state, [in] boolean isAppBack);
    void UnsetOffloadMode([in] unsigned int sessionId);
    void CheckHibernateState([in] boolean onHibernate);
    void GetAsrNoiseSuppressionMode([out] int asrNoiseSuppressionMode); // AsrNoiseSuppressionMode asrNoiseSuppressionMode
    void SetAsrWhisperDetectionMode([in] int asrWhisperDetectionMode); // AsrWhisperDetectionMode asrWhisperDetectionMode
    void GetAsrWhisperDetectionMode([out] int asrWhisperDetectionMode);
    void SetAsrVoiceControlMode([in] int asrVoiceControlMode, [in] boolean on);
    void SetAsrVoiceMuteMode([in] int asrVoiceMuteMode, [in] boolean on); // AsrVoiceMuteMode asrVoiceMuteMode
    void IsWhispering([out] int whisperRes);
    void GetEffectOffloadEnabled([out] boolean isEffectOffloadEnabled);
    void GetAudioEffectProperty([out] AudioEffectPropertyArray propertyArray, [in] int deviceType);
    void SetAudioEffectProperty([in] AudioEffectPropertyArray propertyArray, [in] int deviceType);
    void SuspendRenderSink([in] String sinkName);
    void RestoreRenderSink([in] String sinkName);
    void LoadHdiEffectModel();
    void UpdateEffectBtOffloadSupported([in] boolean isSupported);
    void SetSinkMuteForSwitchDevice([in] String deviceClass, [in] int durationUs, [in] boolean mute, [in] String networkId);
    void SetRotationToEffect([in] unsigned int rotate);
    void UpdateSessionConnectionState([in] int sessionID, [in] int state);
    void SetNonInterruptMute([in] unsigned int sessionId, [in] boolean muteFlag);
    void RestoreSession([in] unsigned int sessionID, [in] RestoreInfoIpc restoreInfoIpc);
    void CreateIpcOfflineStream([out] int errorCode, [out] IRemoteObject client);
    void GetOfflineAudioEffectChains([out] List<String> effectChains);
    void GetStandbyStatus([in] unsigned int sessionId, [out] boolean isStandby, [out] long enterStandbyTime);
    void GenerateSessionId([out] unsigned int sessionId);
    void GetAllSinkInputs([out] List<SinkInput> sinkInputs);
    // TODO remove void SetDefaultAdapterEnable([in] boolean isEnable);
    void NotifyAccountsChanged();
    void NotifyAudioPolicyReady();
    void SetInnerCapLimit([in] unsigned int innerCapLimit);void LoadHdiAdapter([in] unsigned int devMgrType, [in] String adapterName);
    void UnloadHdiAdapter([in] unsigned int devMgrType, [in] String adapterName, [in] boolean force);
    void CheckCaptureLimit([in] AudioPlaybackCaptureConfig config, [out] int innerCapId);
    void ReleaseCaptureLimit([in] int innerCapId);
    void CreateHdiSinkPort([in] String deviceClass, [in] String idInfo, [in] IAudioSinkAttr attr, [out] unsigned int renderId);
    void CreateSinkPort([in] unsigned int idBase, [in] unsigned int idType, [in] String idInfo, [in] IAudioSinkAttr attr, [out] unsigned int renderId);
    void CreateHdiSourcePort([in] String deviceClass, [in] String idInfo, [in] IAudioSourceAttr attr, [out] unsigned int captureId);
    void CreateSourcePort([in] unsigned int idBase, [in] unsigned int idType, [in] String idInfo, [in] IAudioSourceAttr attr, [out] unsigned int captureId);
    void RegisterVADeviceController([in] String macAddress, [in] IRemoteObject controller);
    void UnregisterVADeviceController([in] String macAddress);
    void DestroyHdiPort([in] unsigned int id);
    void SetDeviceConnectedFlag([in] boolean flag);
    void SetDmDeviceType([in] unsigned short dmDeviceType, [in] int deviceType);
    void RegisterDataTransferMonitorParam([in] int callbackId, [in] DataTransferMonitorParam param);
    void UnregisterDataTransferMonitorParam([in] int callbackId);
    void RegisterDataTransferCallback([in] IRemoteObject object);
    void NotifySettingsDataReady();
    void IsAcousticEchoCancelerSupported([in] int sourceType, [out] boolean isSupported);
    void SetLatestMuteState([in] unsigned int sessionId, [in] boolean muteFlag);
    void ForceStopAudioStream([in] int audioType);
    void CreateAudioWorkgroup([in] IRemoteObject object, [out] int workgroupId);
    void ReleaseAudioWorkgroup([in] int workgroupId);
    void AddThreadToGroup([in] int workgroupId, [in] int tokenId);
    void RemoveThreadFromGroup([in] int workgroupId, [in] int tokenId);
    void StartGroup([in] int workgroupId, [in] unsigned long startTime, [in] unsigned long deadlineTime);
    void StopGroup([in] int workgroupId);
    void SetBtHdiInvalidState();
    void SetKaraokeParameters([in] int deviceType, [in] String parameters, [out] boolean ret);
    void IsAudioLoopbackSupported([in] int mode, [in] int deviceType, [out] boolean ret);
    [oneway] void ImproveAudioWorkgroupPrio([in] Map<int, boolean> threads);
    void RestoreAudioWorkgroupPrio([in] Map<int, int> threads);
    void SetRenderWhitelist([in] List<String> list);
    void GetVolumeBySessionId([in] unsigned int sessionId, [out] float volume);
    void AddCaptureInjector([in] unsigned int sinkPortidx, [out] String rate, [out] String format,
        [out] String channels, [out] String bufferSize);
    void RemoveCaptureInjector([in] unsigned int sinkPortidx);
    void RegisterCallbackHandle([in] IRemoteObject object);
    void GetCurrentOutputPipeChangeInfos([out] List<sharedptr<AudioOutputPipeInfo>> pipeChangeInfos);
    void GetCurrentInputPipeChangeInfos([out] List<sharedptr<AudioInputPipeInfo>> pipeChangeInfos);
    void SetCallbackHandleEnable([in] unsigned int callbackId, [in] boolean enable);
    void ReleaseActiveDeviceRoute([in] int deviceType, [in] int deviceFlag, [in] String networkId);
    void SetAuxiliarySinkEnable([in] boolean isEnabled);
    void ReportPlaybackCaptureUserChoice([in] unsigned int sessionId, [in] boolean choice);
    [oneway] void ReportWakeupEvent([in] AudioWakeupTrackInfo audioWakeupTrackInfo);
    void SetAncoRecordingConfigChanged([in] List<String> bundleNameList);
    // WARNING: above functions correspond with AudioServerInterfaceCode

    // undefined in AudioServerInterfaceCode
    [ipccode 1000] void SetForegroundList([in] List<String> list);
    void GetVolumeDataCount([in] String sinkName, [out] long ret);
    void GetPrivacyTypeAudioServer([in] unsigned int sessionId, [out] int privacyType, [out] int ret);
    void RegistAdapterManagerCallback([in] IRemoteObject object, [in] String networkId);
    void UnRegistAdapterManagerCallback([in] String networkId);
    void GetRemoteAudioParameter([in] String networkId, [in] int key, [in] String condition, [out] String value);
    [oneway] void RequestUserPrivacyAuthority([in] unsigned int sessionId);
    void SetAudioSceneForPipe([in] unsigned int pipeId, [in] int audioScene, [in] boolean scoExcludeFlag);
    void CreateCallTransferProxy();
    void NotifySensitiveRecordPermit([in] unsigned int sessionId, [in] boolean isPermitted);
}