sound_engine.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. #define NUM_CHANNELS 4
  5. #define RANDOM_SEED 0xf31782ce
  6. #define ACC_BITS 23
  7. #define ACC_LENGTH (1 << (ACC_BITS - 1))
  8. #define OUTPUT_BITS 16
  9. #define WAVE_AMP (1 << OUTPUT_BITS)
  10. typedef enum
  11. {
  12. SE_WAVEFORM_NONE = 0,
  13. SE_WAVEFORM_NOISE = 1,
  14. SE_WAVEFORM_PULSE = 2,
  15. SE_WAVEFORM_TRIANGLE = 4,
  16. SE_WAVEFORM_SAW = 8,
  17. } SoudEngineWaveformType;
  18. typedef struct
  19. {
  20. uint8_t a, d, s, r, volume;
  21. uint32_t envelope, envelope_speed;
  22. } SoundEngineADSR;
  23. typedef struct
  24. {
  25. uint32_t accumulator;
  26. uint32_t frequency;
  27. uint8_t waveform;
  28. uint16_t pw;
  29. uint32_t lfsr;
  30. SoundEngineADSR adsr;
  31. } SoundEngineChannel;
  32. typedef struct
  33. {
  34. SoundEngineChannel channel[NUM_CHANNELS];
  35. uint32_t sample_rate;
  36. uint16_t* audio_buffer;
  37. uint32_t audio_buffer_size;
  38. bool external_audio_output;
  39. } SoundEngine;
  40. void sound_engine_init(SoundEngine* sound_engine, uint32_t sample_rate, bool external_audio_output, uint32_t audio_buffer_size);
  41. void sound_engine_deinit(SoundEngine* sound_engine);
  42. void sound_engine_set_channel_frequency(SoundEngine* sound_engine, SoundEngineChannel* channel, uint32_t frequency);
  43. void sound_engine_fill_buffer(SoundEngine* sound_engine, uint16_t* audio_buffer, uint32_t audio_buffer_size);