// Copyright 2016 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.
//
// Class to manage audio devices in Brillo.
#ifndef BRILLO_AUDIO_AUDIOSERVICE_BRILLO_AUDIO_MANAGER_H_
#define BRILLO_AUDIO_AUDIOSERVICE_BRILLO_AUDIO_MANAGER_H_
#include <sys/cdefs.h>
#include "brillo_audio_device_info.h"
__BEGIN_DECLS
struct BAudioManager;
typedef struct BAudioManager BAudioManager;
// Get a pointer to a BAudioManager. This object will refer to the same
// underlying client object no matter how many times it is called.
//
// Returns a pointer to a BAudioManager. Returns NULL on failure.
BAudioManager* BAudioManager_new();
// Flag to get input devices.
static const int GET_DEVICES_INPUTS = 1;
// Flag to get output devices.
static const int GET_DEVICES_OUTPUTS = 2;
// Returns the list of input/output devices connected to the system.
//
// Arg:
// brillo_audio_manager: A pointer to a BAudioManager.
// flag: Either GET_DEVICES_INPUTS or GET_DEVICES_OUTPUTS.
// device_array: An array of BAudioDeviceInfo pointers. The caller has to
// allocate this array.
// size: The size of device_array.
// num_devices: A pointer to an unsigned int which will represent the number
// of audio devices connected to the device.
//
// Returns 0 on success and errno on failure.
int BAudioManager_getDevices(
const BAudioManager* brillo_audio_manager, int flag,
BAudioDeviceInfo* device_array[], unsigned int size,
unsigned int* num_devices);
// Select the input device to be used for recording.
//
// Arg:
// brillo_audio_manager: A pointer to a BAudioManager.
// device: Device to set as the input device. Note that the device has to be
// an input device.
//
// Returns 0 on success and errno on failure.
int BAudioManager_setInputDevice(const BAudioManager* brillo_audio_manager,
const BAudioDeviceInfo* device);
// Usage types.
enum BAudioUsage {
kUsageAlarm,
kUsageMedia,
kUsageNotifications,
kUsageSystem,
kUsageInvalid
};
// Select the output device to be used for playback.
//
// Arg:
// brillo_audio_manager: A pointer to a BAudioManager.
// device: Device to set as the output device. Note that the device has to
// be an output device.
// usage: A BAudioUsage type representing a usage to route to |device|.
//
// Returns 0 on success and errno on failure.
int BAudioManager_setOutputDevice(
const BAudioManager* brillo_audio_manager, const BAudioDeviceInfo* device,
BAudioUsage usage);
// Get the number of steps for a given stream type.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
// usage: A BAudioUsage representing the audio stream.
// max_steps: A pointer to an int representing the number of steps for a given
// usage.
//
// Returns 0 on success and errno on failure.
int BAudioManager_getMaxVolumeSteps(const BAudioManager* brillo_audio_manager,
BAudioUsage usage,
int* max_steps);
// Set the number of steps for a given stream type.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
// usage: A BAudioUsage representing the audio stream.
// max_steps: An int representing the number of steps to use for a given
// usage.
//
// Returns 0 on success and errno on failure.
int BAudioManager_setMaxVolumeSteps(const BAudioManager* brillo_audio_manager,
BAudioUsage usage,
int max_steps);
// Set the volume for a given stream type.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
// usage: A BAudioUsage representing the audio stream.
// device: A pointer to a BAudioDeviceInfo object.
// value: An int representing the index to set the volume to. The index must
// be less than max_steps if BAudioManager_setMaxVolumeSteps was
// called or 100 otherwise.
//
// Returns 0 on success and errno on failure.
int BAudioManager_setVolumeIndex(const BAudioManager* brillo_audio_manager,
BAudioUsage usage,
const BAudioDeviceInfo* device,
int index);
// Get the volume for a given stream type.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
// usage: A BAudioUsage representing the audio stream.
// device: A pointer to a BAudioDeviceInfo object.
// value: A pointer to int. This will be set to an int representing the volume
// index for |usage|.
//
// Returns 0 on success and errno on failure.
int BAudioManager_getVolumeIndex(const BAudioManager* brillo_audio_manager,
BAudioUsage usage,
const BAudioDeviceInfo* device,
int* index);
// Get the default stream for volume buttons. If
// BAudioManager_setVolumeControlUsage has not been called, this will return
// kInvalidUsage.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
// usage: A pointer to a BAudioUsage representing the audio stream.
//
// Returns 0 on success and errno on failure.
int BAudioManager_getVolumeControlUsage(
const BAudioManager* brillo_audio_manager, BAudioUsage* usage);
// Set the default stream to use for volume buttons. By default, streams will be
// ordered by priority:
// 1. kUsageAlarm
// 2. kUsageNotifications
// 3. kUsageSystem
// 4. kUsageMedia
//
// Calling BAudioMananager_setVolumeControlUsage with kInvalidUsage will reset
// the volume control stream to its default priorities and undo the effects of
// previous calls to BAudioManager_setVolumeControlUsage.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
// usage: A BAudioUsage representing the audio stream.
//
// Returns 0 on success and errno on failure.
int BAudioManager_setVolumeControlUsage(
const BAudioManager* brillo_audio_manager, BAudioUsage usage);
// Increment the volume of active streams or stream selected using
// BAudioManager_setVolumeControlUsage.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
//
// Returns 0 on success and errno on failure.
int BAudioManager_incrementVolume(const BAudioManager* brillo_audio_manager);
// Decrement the volume of active streams or stream selected using
// BAudioManager_setVolumeControlUsage.
//
// Args:
// brillo_audio_manager: A pointer to a BAudioManager object.
//
// Returns 0 on success and errno on failure.
int BAudioManager_decrementVolume(const BAudioManager* brillo_audio_manager);
// Object used for callbacks.
struct BAudioCallback {
// Function to be called when an audio device is added. If multiple audio
// devices are added, then this function will be called multiple times. The
// user is not responsible for freeing added_device.
void (*OnAudioDeviceAdded)(const BAudioDeviceInfo* added_device,
void* user_data);
// Function to be called when an audio device is removed. If multiple audio
// devices are removed, then this function will be called multiple times. The
// user is not responsible for freeing removed_device.
void (*OnAudioDeviceRemoved)(const BAudioDeviceInfo* removed_device,
void* user_data);
// Function to be called when the volume button is pressed.
void (*OnVolumeChanged)(BAudioUsage usage,
int old_volume_index,
int new_volume_index,
void* user_data);
};
typedef struct BAudioCallback BAudioCallback;
// Registers a callback object that lets clients know when audio devices have
// been added/removed from the system.
//
// Arg:
// brillo_audio_manager: A pointer to a BAudioManager.
// callback: An object of type BAudioCallback. The BAudioManager
// maintains ownership of this object.
// user_data : A pointer to user data. This is not used by BAudioManager and
// is passed as an arg to callbacks.
// callback_id: A pointer to an int. The int represents a token that can be
// used to de-register this callback. Contains 0 on failure.
//
// Returns 0 on success and errno on failure.
int BAudioManager_registerAudioCallback(
const BAudioManager* brillo_audio_manager, const BAudioCallback* callback,
void* user_data, int* callback_id);
// Unregisters a callback object.
//
// Arg:
// brillo_audio_manager: A pointer to a BAudioManager.
// callback_id: A token correspoding to the callback object.
//
// Returns 0 on success and errno on failure.
int BAudioManager_unregisterAudioCallback(
const BAudioManager* brillo_audio_manager, int callback_id);
// Free a Brillo audio manager object.
//
// Arg:
// brillo_audio_manager: A pointer to a BAudioManager to be freed.
//
// Returns 0 on success and errno on failure.
int BAudioManager_delete(BAudioManager* brillo_audio_manager);
__END_DECLS
#endif // BRILLO_AUDIO_AUDIOSERVICE_BRILLO_AUDIO_MANAGER_H_