This repository has been archived by the owner on Dec 4, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaudio_subsystem.cpp
77 lines (68 loc) · 2.49 KB
/
audio_subsystem.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "audio_subsystem.h"
#include "project_config.h"
audio_buffer_pool_t *init_audio()
{
static audio_format_t audio_format = {
.sample_freq = 44100,
.pcm_format = AUDIO_PCM_FORMAT_S32,
.channel_count = (audio_channel_t)2};
static audio_buffer_format_t producer_format = {
.format = &audio_format,
.sample_stride = 8};
audio_buffer_pool_t *producer_pool = audio_new_producer_pool(&producer_format, 3,
SAMPLES_PER_BUFFER); // todo correct size
bool __unused ok;
const audio_format_t *output_format;
#if USE_AUDIO_I2S
audio_i2s_config_t config = {
.data_pin = PIN_I2S_DOUT,
.clock_pin_base = PIN_I2S_BCK,
.dma_channel = 0,
.pio_sm = 0};
output_format = audio_i2s_setup(&audio_format, &audio_format, &config);
if (!output_format)
{
panic("PicoAudio: Unable to open audio device.\n");
}
printf("PicoAudio: Audio output format: %d Hz, %d bit, %d channel\n",
output_format->sample_freq,
output_format->pcm_format == AUDIO_PCM_FORMAT_S16 ? 16 : 32,
output_format->channel_count);
ok = audio_i2s_connect(producer_pool);
assert(ok);
{ // initial buffer data
audio_buffer_t *buffer = take_audio_buffer(producer_pool, true);
int32_t *samples = (int32_t *)buffer->buffer->bytes;
printf("PicoAudio: Initializing audio buffer with %d samples\n",
buffer->buffer->size / sizeof(int32_t));
for (uint i = 0; i < buffer->max_sample_count; i++)
{
samples[i * 2 + 0] = 0;
samples[i * 2 + 1] = 0;
}
buffer->sample_count = buffer->max_sample_count;
give_audio_buffer(producer_pool, buffer);
}
audio_i2s_set_enabled(true);
#elif USE_AUDIO_PWM
output_format = audio_pwm_setup(&audio_format, -1, &default_mono_channel_config);
if (!output_format)
{
panic("PicoAudio: Unable to open audio device.\n");
}
ok = audio_pwm_default_connect(producer_pool, false);
assert(ok);
audio_pwm_set_enabled(true);
#elif USE_AUDIO_SPDIF
output_format = audio_spdif_setup(&audio_format, &audio_spdif_default_config);
if (!output_format)
{
panic("PicoAudio: Unable to open audio device.\n");
}
// ok = audio_spdif_connect(producer_pool);
ok = audio_spdif_connect(producer_pool);
assert(ok);
audio_spdif_set_enabled(true);
#endif
return producer_pool;
}