☑ Selection of voice codec : Codec2
☑ Implementing voice codec on embedded platform : esp32-codec2
☐ Making unit test for voice codec
☐ Turning Codec2 into a standalone Arduino library, which will allow for easier integration by third parties.
☑ Audio playback : Sine output by I²S on ESP32's internal DAC : esp32-dds (direct digital synthesis)
☑ Real time Codec2 decoding and audio output on ESP32's internal DAC : esp32-codec2-DAC
☑ Audio capture (through I²S)
☑ Output sine wave to external I2S Audio codec (i.e. SGTL5000)
☑ Decode Codec2 packets in real time and output them on SGTL5000 headphone and line out. The Codec2 decoding and audio streaming is all done in tasks. The 'loop'-function has nothing to do.
☑ Audio feed-through using SGTL5000 : it took some tweaking to adjust the input audio level to line-in levels of the SGTL5000 and headphone output volume settings. I2S-peripheral works full duplex here, while ESP32 documentation only mentions half-duplex operation.
☑ Real time codec2 encoding analog audio from SGTL5000's line input. Codec packets are printed real time in base64 format to serial port
☐ Audio filtering in SGTL5000, which codec2 should benefit from.
☑ Half-duplex operation : every few seconds the codec switches between encoding and decoding. It decodes packets stored in flash. It encodes audio from the SGTL5000 codec.
☑ Refactoring encoding/decoding of packets. Codec2-engine now has two separate queues for output and two separate queues for input. Semaphores have been removed as they made the code unnecessarily complicated.
☑ Generating some RTTTL music and transmitting it with the SX1278 FSK-modem on 434MHz. The RSP1A decodes it fine using CubicSDR. It's not very useful, but it's fun. Using PDM, we might even be able to play rudimentary audio.
☑ SX1278 modules using RadioLib : LoRa, FSK and OOK.
☑ SI4463 module using RadioHead : 2GFSK
☑ SI4463 module using Zak Kemble's SI4463 library : 4GFSK in 6.25kHz channel spacing
☑ Adding SI4463 to RadioLib library (basic RX/TX works, but the code needs a lot of clean up)
Audio & wireless combined
☑ One way radio : transmitter station sends codec2 packets, while receiving station decodes them and plays them through the SGTL5000 on the headphone.
☑ Two way radio with PTT : both stations run the same code. When PTT-button is pushed, the station starts encoding audio from line-in of the SGTL5000 and broadcasts them using the SI4463. The other station receives the packets, decodes them, and plays the SGTL5000. The custom main.cpp source file is less than 150 lines long. The remainder of the code consists of reusable libraries.
Issues listed here are of minor priority. They are not blocking further development of the project. A working prototype is considered more important. If we would spend too much time on the issues listed here, we could get bogged down into trouble, potentially leading to never building something that works.
- Find out why codec2 on the ESP32 doesn't yield the same codec2 packets as the codec2 on the PC, although they're based on the same code base. ESP32-codec2 packets can successfully be decoded by c2dec on the PC, so the two implementations are still compatible.
- Clean up SI4463 code (replace Silabs official header files) and add functionality (e.g. read RSSI, support for fixed length packets).