// // Created by bruno on 13. 7. 2026. // #ifndef AUDIOCODER_ENCODER_H #define AUDIOCODER_ENCODER_H #define SAMPLE_RATE 48000 #define MAX_BITS 16 #define CLOCK_VOICE MAX_BITS #define MAX_PACKET 223 #include #include typedef struct SynthVoice { uint32_t phase; uint32_t phaseStep; uint16_t frequency; uint8_t volume; } SynthVoice; typedef enum { TX_IDLE, TX_PREAMBLE, TX_SYNC, TX_DATA, TX_END } TxState; typedef struct { unsigned int bitCount; unsigned int byteIndex; unsigned int bitIndex; uint8_t buffer[1024 * 1024 * 8]; unsigned int bufferSize; uint16_t startFreq; uint16_t endFreq; uint16_t dataSpacing; uint16_t clock0; uint16_t clock1; bool clockState; uint32_t symbolSamples; uint32_t samplesRemaining; TxState state; uint32_t preambleSymbols; uint32_t syncIndex; bool transmitting; } Encoder; typedef struct AudioData { SynthVoice synthVoices[MAX_BITS + 1]; Encoder *encoder; } AudioData; extern Encoder encoder; extern AudioData encodedAudioData; extern SDL_AudioDeviceID dev; // Internal audio bus for loopback - simple ring buffer #define INTERNAL_BUFFER_SIZE 262144 extern float internalBusSamples[INTERNAL_BUFFER_SIZE]; extern volatile uint32_t internalBusWrite; extern volatile uint32_t internalBusRead; void startEncoder(Encoder *enc); void stopEncoder(Encoder *enc); void initAudioEncoder(); extern const uint8_t syncBytes[4]; #endif //AUDIOCODER_ENCODER_H