Skip to content

Commit a1fe288

Browse files
committed
make loop=True required for constant play, add test code
1 parent b3b3577 commit a1fe288

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

shared-module/audiocore/RawSample.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void audioio_rawsample_reset_buffer(audioio_rawsample_obj_t *self,
5656
bool single_channel_output,
5757
uint8_t channel) {
5858

59-
self->buffer_index = 0;
59+
// self->buffer_index = 0;
6060
}
6161

6262
audioio_get_buffer_result_t audioio_rawsample_get_buffer(audioio_rawsample_obj_t *self,
@@ -82,7 +82,8 @@ audioio_get_buffer_result_t audioio_rawsample_get_buffer(audioio_rawsample_obj_t
8282
*buffer = self->buffer + self->len / 2 * self->buffer_index;
8383
}
8484
self->buffer_index = 1 - self->buffer_index;
85-
return GET_BUFFER_MORE_DATA;
85+
// return GET_BUFFER_MORE_DATA;
86+
return GET_BUFFER_DONE;
8687
}
8788
}
8889

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import audiocore
2+
import audiopwmio
3+
import audiomixer
4+
import board
5+
import array
6+
import time
7+
import math
8+
9+
CHANNELS = 2
10+
RATE = 8000
11+
SAMPLE_TYPE = "H"
12+
OFFSET = 2**15 - 1
13+
BUFFER_SIZE = 640
14+
SINGLE_BUFFER = True
15+
LOOP = True
16+
17+
# (frequency, amp_left, amp_right)
18+
VOICES = ((200, 1, 0), (400, 0, 1), (100, 1, 1))
19+
20+
21+
def play(
22+
voices=VOICES,
23+
channels=CHANNELS,
24+
rate=RATE,
25+
sample_type=SAMPLE_TYPE,
26+
offset=OFFSET,
27+
buffer_size=BUFFER_SIZE,
28+
single_buffer=SINGLE_BUFFER,
29+
loop=LOOP,
30+
):
31+
waves = []
32+
samples = []
33+
for v in voices:
34+
print(v)
35+
sample_length = int(rate // v[0])
36+
wave = array.array(sample_type, [offset] * sample_length * channels)
37+
for i in range(0, sample_length):
38+
if channels == 1:
39+
wave[i] = int(
40+
math.sin(math.pi * 2 * i / sample_length) * v[1] * (2**15 - 1) + offset
41+
)
42+
else:
43+
wave[2 * i] = int(
44+
math.sin(math.pi * 2 * i / sample_length) * v[1] * (2**15 - 1) + offset
45+
)
46+
wave[2 * i + 1] = int(
47+
math.sin(math.pi * 2 * i / sample_length) * v[2] * (2**15 - 1) + offset
48+
)
49+
waves.append(wave)
50+
samples.append(
51+
audiocore.RawSample(
52+
wave, sample_rate=rate, channel_count=channels, single_buffer=single_buffer
53+
)
54+
)
55+
mixer = audiomixer.Mixer(
56+
voice_count=len(voices),
57+
sample_rate=rate,
58+
channel_count=channels,
59+
bits_per_sample=16,
60+
samples_signed=False,
61+
buffer_size=buffer_size,
62+
)
63+
pwm = audiopwmio.PWMAudioOut(left_channel=board.D12, right_channel=board.D13)
64+
pwm.play(mixer)
65+
for i in range(len(samples)):
66+
mixer.voice[i].play(samples[i], loop=loop)
67+
mixer.voice[i].level = 0.5

0 commit comments

Comments
 (0)