Audio System + Drivers (#562)
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/audio_codec.h>
|
||||
#include <tactility/error.h>
|
||||
#include <tactility/device.h>
|
||||
|
||||
#define AUDIO_CODEC_DRIVER_API(driver) ((struct AudioCodecApi*)driver->api)
|
||||
|
||||
extern "C" {
|
||||
|
||||
error_t audio_codec_open(Device* device, const struct AudioCodecStreamConfig* config) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->open(device, config);
|
||||
}
|
||||
|
||||
error_t audio_codec_close(Device* device) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->close(device);
|
||||
}
|
||||
|
||||
error_t audio_codec_read(Device* device, void* data, size_t data_size, size_t* bytes_read, TickType_t timeout) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->read(device, data, data_size, bytes_read, timeout);
|
||||
}
|
||||
|
||||
error_t audio_codec_write(Device* device, const void* data, size_t data_size, size_t* bytes_written, TickType_t timeout) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->write(device, data, data_size, bytes_written, timeout);
|
||||
}
|
||||
|
||||
error_t audio_codec_set_volume(Device* device, AudioCodecDirection direction, float volume_percent) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->set_volume(device, direction, volume_percent);
|
||||
}
|
||||
|
||||
error_t audio_codec_get_volume(Device* device, AudioCodecDirection direction, float* volume_percent) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->get_volume(device, direction, volume_percent);
|
||||
}
|
||||
|
||||
error_t audio_codec_set_mute(Device* device, AudioCodecDirection direction, bool muted) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->set_mute(device, direction, muted);
|
||||
}
|
||||
|
||||
error_t audio_codec_get_mute(Device* device, AudioCodecDirection direction, bool* muted) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->get_mute(device, direction, muted);
|
||||
}
|
||||
|
||||
error_t audio_codec_get_native_sample_rate(Device* device, AudioCodecDirection direction, uint32_t* rate_hz) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->get_native_sample_rate(device, direction, rate_hz);
|
||||
}
|
||||
|
||||
error_t audio_codec_get_native_channels(Device* device, AudioCodecDirection direction, uint8_t* channels) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->get_native_channels(device, direction, channels);
|
||||
}
|
||||
|
||||
error_t audio_codec_get_capabilities(Device* device, AudioCodecDirection* supported_directions) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->get_capabilities(device, supported_directions);
|
||||
}
|
||||
|
||||
error_t audio_codec_get_input_gain_multiplier(Device* device, float* gain) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
if (AUDIO_CODEC_DRIVER_API(driver)->get_input_gain_multiplier == nullptr) {
|
||||
*gain = 1.0f;
|
||||
return ERROR_NONE;
|
||||
}
|
||||
return AUDIO_CODEC_DRIVER_API(driver)->get_input_gain_multiplier(device, gain);
|
||||
}
|
||||
|
||||
const struct DeviceType AUDIO_CODEC_TYPE {
|
||||
.name = "audio-codec"
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/audio_stream.h>
|
||||
#include <tactility/error.h>
|
||||
#include <tactility/device.h>
|
||||
|
||||
#define AUDIO_STREAM_DRIVER_API(driver) ((struct AudioStreamApi*)driver->api)
|
||||
|
||||
extern "C" {
|
||||
|
||||
error_t audio_stream_open_input(Device* device, const struct AudioStreamConfig* config, AudioStreamHandle* outHandle) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->open_input(device, config, outHandle);
|
||||
}
|
||||
|
||||
error_t audio_stream_open_output(Device* device, const struct AudioStreamConfig* config, AudioStreamHandle* outHandle) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->open_output(device, config, outHandle);
|
||||
}
|
||||
|
||||
error_t audio_stream_read(AudioStreamHandle handle, void* data, size_t data_size, size_t* bytes_read, TickType_t timeout) {
|
||||
const auto* driver = device_get_driver(handle->device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->read(handle, data, data_size, bytes_read, timeout);
|
||||
}
|
||||
|
||||
error_t audio_stream_write(AudioStreamHandle handle, const void* data, size_t data_size, size_t* bytes_written, TickType_t timeout) {
|
||||
const auto* driver = device_get_driver(handle->device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->write(handle, data, data_size, bytes_written, timeout);
|
||||
}
|
||||
|
||||
error_t audio_stream_close(AudioStreamHandle handle) {
|
||||
const auto* driver = device_get_driver(handle->device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->close(handle);
|
||||
}
|
||||
|
||||
error_t audio_stream_set_volume(Device* device, AudioCodecDirection direction, float volume_percent) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->set_volume(device, direction, volume_percent);
|
||||
}
|
||||
|
||||
error_t audio_stream_get_volume(Device* device, AudioCodecDirection direction, float* volume_percent) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->get_volume(device, direction, volume_percent);
|
||||
}
|
||||
|
||||
error_t audio_stream_set_mute(Device* device, AudioCodecDirection direction, bool muted) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->set_mute(device, direction, muted);
|
||||
}
|
||||
|
||||
error_t audio_stream_get_mute(Device* device, AudioCodecDirection direction, bool* muted) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->get_mute(device, direction, muted);
|
||||
}
|
||||
|
||||
error_t audio_stream_set_enabled(Device* device, AudioCodecDirection direction, bool enabled) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->set_enabled(device, direction, enabled);
|
||||
}
|
||||
|
||||
error_t audio_stream_get_enabled(Device* device, AudioCodecDirection direction, bool* enabled) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->get_enabled(device, direction, enabled);
|
||||
}
|
||||
|
||||
error_t audio_stream_is_supported(Device* device, AudioCodecDirection direction, bool* supported) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->is_supported(device, direction, supported);
|
||||
}
|
||||
|
||||
error_t audio_stream_set_change_callback(Device* device, AudioStreamChangeCallback callback, void* user_data) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
return AUDIO_STREAM_DRIVER_API(driver)->set_change_callback(device, callback, user_data);
|
||||
}
|
||||
|
||||
const struct DeviceType AUDIO_STREAM_TYPE {
|
||||
.name = "audio-stream"
|
||||
};
|
||||
|
||||
}
|
||||
@@ -38,6 +38,20 @@ error_t i2s_controller_set_rx_tdm_config(struct Device* device, const struct I2s
|
||||
return I2S_DRIVER_API(driver)->set_rx_tdm_config(device, config);
|
||||
}
|
||||
|
||||
error_t i2s_controller_set_rx_pdm_config(struct Device* device, const struct I2sPdmRxConfig* config) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
if (!I2S_DRIVER_API(driver)->set_rx_pdm_config) return ERROR_NOT_SUPPORTED;
|
||||
return I2S_DRIVER_API(driver)->set_rx_pdm_config(device, config);
|
||||
}
|
||||
|
||||
error_t i2s_controller_disable_direction(struct Device* device, bool isInput) {
|
||||
const auto* driver = device_get_driver(device);
|
||||
if (!I2S_DRIVER_API(driver)->disable_direction) {
|
||||
return I2S_DRIVER_API(driver)->reset(device);
|
||||
}
|
||||
return I2S_DRIVER_API(driver)->disable_direction(device, isInput);
|
||||
}
|
||||
|
||||
const struct DeviceType I2S_CONTROLLER_TYPE {
|
||||
.name = "i2s-controller"
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user