arduino-audio-driver
Loading...
Searching...
No Matches
ZephyrDriverCommon.h
Go to the documentation of this file.
1#pragma once
2
3#include <assert.h>
4#include <stdint.h>
5
6#include "DriverCommon.h"
8#include "Platforms/API_I2C.h"
9
10namespace audio_driver {
11
23 public:
24
26 void setAddress(uint8_t addr) { i2c_addr = addr; }
27
29 uint8_t address() { return i2c_addr; }
30
32 void setWire(i2c_bus_handle_t w) { wire = w; }
33
36
38 virtual bool begin(uint32_t sample_rate, uint8_t bits, codec_mode_t mode,
39 i2s_format_t fmt, bool is_master, uint8_t channels) = 0;
40
43 virtual bool setVolume(int volume) {
44 volume_percent = volume;
45 return true;
46 }
47
49 virtual int getVolume() { return volume_percent; }
50
53 virtual bool setMute(bool mute) {
54 (void)mute;
55 return false;
56 }
57
65 virtual bool setActive(codec_mode_t mode) {
66 return setMute(!(mode & CODEC_MODE_DECODE));
67 }
68
71 virtual bool setInputVolume(int volume) { return false;}
72
75 virtual int getInputVolume() { return input_volume_percent; }
76
78 virtual bool isInputVolumeSupported() { return false;}
79
83 virtual bool setDevices(input_device_t input_device, output_device_t output_device){ return true;}
84
85 protected:
87 uint8_t i2c_addr = 0;
89 int volume_percent = 100;
92
94 bool writeReg(uint8_t reg, uint8_t value) {
95 assert(wire != nullptr);
96 return i2c_bus_write_bytes(wire, i2c_addr, &reg, 1, &value, 1) == 0;
97 }
98
100 bool readReg(uint8_t reg, uint8_t& value, bool stopBit=true) {
101 assert(wire != nullptr);
102 #if defined(ARDUINO) && !AUDIO_DRIVER_FORCE_IDF
103 return i2c_bus_read_bytes(wire, i2c_addr, &reg, 1, &value, 1, stopBit) == 0;
104 #else
105 return i2c_bus_read_bytes(wire, i2c_addr, &reg, 1, &value, 1) == 0;
106 #endif // defined(ARDUINO) && !AUDIO_DRIVER_FORCE_IDF
107 }
108
110 bool updateReg(uint8_t reg, uint8_t mask, uint8_t value) {
111 uint8_t old = 0;
112 if (!readReg(reg, old)) return false;
113 uint8_t updated = (old & ~mask) | (value & mask);
114 if (updated == old) return true;
115 return writeReg(reg, updated);
116 }
117
119 bool writeReg16(uint8_t reg, uint16_t value) {
120 assert(wire != nullptr);
121 uint8_t data[2] = {(uint8_t)(value >> 8), (uint8_t)(value & 0xFF)};
122 return i2c_bus_write_bytes(wire, i2c_addr, &reg, 1, data, 2) == 0;
123 }
124
126 bool readReg16(uint8_t reg, uint16_t& value) {
127 assert(wire != nullptr);
128 uint8_t data[2] = {0, 0};
129 if (i2c_bus_read_bytes(wire, i2c_addr, &reg, 1, data, 2) != 0)
130 return false;
131 value = ((uint16_t)data[0] << 8) | data[1];
132 return true;
133 }
134
136 bool updateReg16(uint8_t reg, uint16_t mask, uint16_t value) {
137 uint16_t old = 0;
138 if (!readReg16(reg, old)) return false;
139 uint16_t updated = (old & ~mask) | (value & mask);
140 if (updated == old) return true;
141 return writeReg16(reg, updated);
142 }
143
144};
145
146} // namespace audio_driver
Common parent class for codec drivers that have been ported from the Zephyr RTOS audio driver impleme...
Definition ZephyrDriverCommon.h:22
virtual bool setActive(codec_mode_t mode)
Definition ZephyrDriverCommon.h:65
virtual bool isInputVolumeSupported()
Returns true if the driver supports setting the input volume, false otherwise. By default we return f...
Definition ZephyrDriverCommon.h:78
virtual bool setInputVolume(int volume)
Definition ZephyrDriverCommon.h:71
virtual int getVolume()
Provides the output volume in % (0...100) that was set with setVolume()
Definition ZephyrDriverCommon.h:49
uint8_t i2c_addr
Definition ZephyrDriverCommon.h:87
bool readReg16(uint8_t reg, uint16_t &value)
Reads a 16 bit (big endian) value from an 8 bit register address.
Definition ZephyrDriverCommon.h:126
i2c_bus_handle_t getWire()
Provides the actual I2C communication object.
Definition ZephyrDriverCommon.h:35
bool updateReg(uint8_t reg, uint8_t mask, uint8_t value)
Read-Modify-Write of a single byte register.
Definition ZephyrDriverCommon.h:110
virtual bool begin(uint32_t sample_rate, uint8_t bits, codec_mode_t mode, i2s_format_t fmt, bool is_master, uint8_t channels)=0
Initializes the codec.
bool writeReg16(uint8_t reg, uint16_t value)
Writes a 16 bit (big endian) value to an 8 bit register address.
Definition ZephyrDriverCommon.h:119
void setWire(i2c_bus_handle_t w)
Defines the I2C communication object.
Definition ZephyrDriverCommon.h:32
virtual bool setMute(bool mute)
Definition ZephyrDriverCommon.h:53
void setAddress(uint8_t addr)
Defines the I2C address of the codec.
Definition ZephyrDriverCommon.h:26
int volume_percent
Last volume (in %) provided to setVolume()
Definition ZephyrDriverCommon.h:89
bool readReg(uint8_t reg, uint8_t &value, bool stopBit=true)
Reads a single byte from an 8 bit register address.
Definition ZephyrDriverCommon.h:100
uint8_t address()
Provides the actual I2C address of the codec.
Definition ZephyrDriverCommon.h:29
bool updateReg16(uint8_t reg, uint16_t mask, uint16_t value)
Read-Modify-Write of a 16 bit (big endian) register.
Definition ZephyrDriverCommon.h:136
virtual bool setDevices(input_device_t input_device, output_device_t output_device)
Definition ZephyrDriverCommon.h:83
virtual int getInputVolume()
Definition ZephyrDriverCommon.h:75
i2c_bus_handle_t wire
Definition ZephyrDriverCommon.h:86
bool writeReg(uint8_t reg, uint8_t value)
Writes a single byte to an 8 bit register address.
Definition ZephyrDriverCommon.h:94
virtual bool setVolume(int volume)
Definition ZephyrDriverCommon.h:43
int input_volume_percent
Last input volume (in %) provided to setInputVolume()
Definition ZephyrDriverCommon.h:91
Namespace for audio driver components.
Definition AudioBoard.h:5
input_device_t
Definition DriverCommon.h:170
codec_mode_t
Definition DriverCommon.h:290
@ CODEC_MODE_DECODE
Definition DriverCommon.h:294
output_device_t
Definition DriverCommon.h:186
i2s_format_t
Definition DriverCommon.h:250
void * i2c_bus_handle_t
Definition DriverCommon.h:155