Proper single shot/loop mode

main
eleccoder 2021-08-01 15:29:00 +02:00
rodzic a41768fd53
commit 113778cbf5
1 zmienionych plików z 45 dodań i 37 usunięć

Wyświetl plik

@ -27,12 +27,18 @@
// WARNING: ATTOW, the pico audio PWM lib worked only @ 22050 Hz sampling frequency and 48 MHz system clock
// This is documented here https://github.com/raspberrypi/pico-extras
// This is documented here: https://github.com/raspberrypi/pico-extras
#define PICO_EXTRA_AUDIO_PWM_LIB_FIXED_SAMPLE_FREQ_IN_HZ (22050)
#define SEND_LOOP_DEBUG (0) // For test & debug
#define SINE_WAVE_TEST (0) // For test & debug
typedef struct AudioCallBackUserData
{
uint aprs_sample_freq_in_hz;
bool is_loop;
} AudioCallBackUserData_t;
audio_buffer_pool_t* init_audio(uint sample_freq_in_hz, uint16_t audio_buffer_format)
{
@ -65,7 +71,7 @@ audio_buffer_pool_t* init_audio(uint sample_freq_in_hz, uint16_t audio_buffer_fo
static void init(uint sample_freq_in_hz)
{
// WARNING: ATTOW, the pico audio PWM lib worked only @ 22050 Hz sampling frequency and 48 MHz system clock
// This is documented here https://github.com/raspberrypi/pico-extras
// This is documented here: https://github.com/raspberrypi/pico-extras
if (sample_freq_in_hz == PICO_EXTRA_AUDIO_PWM_LIB_FIXED_SAMPLE_FREQ_IN_HZ)
{
@ -89,15 +95,18 @@ static void init(uint sample_freq_in_hz)
}
static void fill_audio_buffer(audio_buffer_pool_t* audio_pool, const int16_t* pcm_data, uint num_samples)
static void fill_audio_buffer(audio_buffer_pool_t* audio_pool, const int16_t* pcm_data,
uint num_samples, bool is_loop_forever)
{
uint pos = 0u;
const uint8_t volume = 128u;
while (true)
bool is_keep_going = true;
while (is_keep_going)
{
audio_buffer_t* buffer = take_audio_buffer(audio_pool, true);
int16_t* samples = (int16_t*)buffer->buffer->bytes;
audio_buffer_t* buffer = take_audio_buffer(audio_pool, true);
int16_t* samples = (int16_t*)buffer->buffer->bytes;
for (uint i = 0u; i < buffer->max_sample_count; i++)
{
@ -106,7 +115,15 @@ static void fill_audio_buffer(audio_buffer_pool_t* audio_pool, const int16_t* pc
if (pos == num_samples)
{
pos = 0u;
if (is_loop_forever)
{
pos = 0u;
}
else
{
is_keep_going = false;
break;
}
}
}
@ -138,49 +155,40 @@ static void send1kHz(uint sample_freq_in_hz)
audio_buffer_pool_t* audio_pool = init_audio(sample_freq_in_hz, AUDIO_BUFFER_FORMAT_PCM_S16);
while (true)
{
fill_audio_buffer(audio_pool, sine_wave_table, num_samples);
}
fill_audio_buffer(audio_pool, sine_wave_table, num_samples, true);
free(sine_wave_table);
}
static void sendAPRS_audioCallback(void* user_data, int16_t* pcm_data, size_t num_samples)
static void sendAPRS_audioCallback(void* callback_user_data, int16_t* pcm_data, size_t num_samples)
{
const uint aprs_sampl_freq_in_hz = *((const uint*)user_data);
const AudioCallBackUserData_t user_data = *((const AudioCallBackUserData_t*)callback_user_data);
audio_buffer_pool_t* audio_pool = init_audio(aprs_sampl_freq_in_hz, AUDIO_BUFFER_FORMAT_PCM_S16);
audio_buffer_pool_t* audio_pool = init_audio(user_data.aprs_sample_freq_in_hz, AUDIO_BUFFER_FORMAT_PCM_S16);
#if (SEND_LOOP_DEBUG == 1)
while (true)
{
#endif // SEND_LOOP_DEBUG
fill_audio_buffer(audio_pool, pcm_data, num_samples);
#if (SEND_LOOP_DEBUG == 1)
}
#endif // SEND_LOOP_DEBUG
fill_audio_buffer(audio_pool, pcm_data, num_samples, user_data.is_loop);
}
static void sendAPRS(const char* call_sign_src,
const char* call_sign_dst,
const char* aprs_path_1,
const char* aprs_path_2,
const char* aprs_message,
static void sendAPRS(const char* call_sign_src,
const char* call_sign_dst,
const char* aprs_path_1,
const char* aprs_path_2,
const char* aprs_message,
const double latitude_in_deg,
const double longitude_in_deg,
const double altitude_in_m)
const double altitude_in_m,
const bool is_loop)
{
// Known from the 'ax25beacon' library
static const uint APRS_SAMPL_FREQ_IN_HZ = 48000u;
static AudioCallBackUserData_t callback_user_data;
init(APRS_SAMPL_FREQ_IN_HZ);
callback_user_data.aprs_sample_freq_in_hz = 48000u; // Known from the 'ax25beacon' library
callback_user_data.is_loop = is_loop;
ax25_beacon((void*)&APRS_SAMPL_FREQ_IN_HZ, // User data
init(callback_user_data.aprs_sample_freq_in_hz);
ax25_beacon((void*)&callback_user_data,
sendAPRS_audioCallback,
call_sign_src,
call_sign_dst,
@ -210,8 +218,8 @@ int main()
"Test message",
10.0, // Lat in deg
20.0, // Long in deg
100.0 // Alt in m
);
100.0, // Alt in m
false); // Loop forever
#endif // SINE_WAVE_TEST, !SINE_WAVE_TEST