Hallo,
ich habe ein Problem mit einem Ptr Zugriff. Das ganze stammt aus einem
Code um Audio Samples auf einem STM32F4 mit Codec abzuspielen.
Es werden drei Samples ausgelesen und aufaddiert.
Das Problem ist nun, dass der Zugriff mittels Array (also der
nicht auskommentierte "audiobuf[s] += ..." funktioniert, die Samples
werden sauber gespielt. Verwende ich aber den Ptr Zugriff, also
"*audiobuf++ = ...", dann werden die Samples verzerrt. Funktional sehe
ich zwischen beiden Varianten keinen Unterschied, also muss ich etwas
übersehen. Aber was?
Ebenso bringt ein
1 | *audiobuf = *audiobuf + (int16_t) sample;
|
2 | audiobuf++;
|
nichts. Ist eh m.E. funktional identisch mit "*audiobuf++ += ..."
Ja, der Optimierer ist an. arm-gcc, -O2. Aber auch ein -O0 macht keinen
Unterschied. Was übersehe ich?
1 | static void PlaySamples(int16_t *audiobuf)
|
2 | {
|
3 | for (int i=0; i<3; i++)
|
4 | {
|
5 | if (inst[i].running == 1)
|
6 | {
|
7 | for (int s=0; s < AUDIO_BLOCK_SAMPLES; s += 2)
|
8 | {
|
9 | int32_t sample = ((int32_t) inst[i].samples[inst[i].pos++] * inst[i].volume/255 / 2 );
|
10 |
|
11 | // Frist Sample is left channel
|
12 | audiobuf[s] += (int16_t) sample;
|
13 | //*audiobuf++ += (int16_t) sample;
|
14 |
|
15 | // Second Sample is right channel
|
16 | audiobuf[s+1] += (int16_t) sample;
|
17 | //*audiobuf++ += (int16_t) sample;
|
18 |
|
19 | if (inst[i].pos >= inst[i].length) {
|
20 | inst[i].running = 0;
|
21 | inst[i].pos = 0;
|
22 | break;
|
23 | }
|
24 | }
|
25 | }
|
26 | }
|
27 | }
|