Hallo,
ich versuche gerade per I2S und DMA ein Soundstück im Loop mit einer
Rohlänge von 4096 abzuspielen.
Wenn ich meinen Buffer direkt und in voller Länge übergebe funktioniert
es auch gut.
Nur muss ich mit FIFO Buffern arbeiten, weil ich das Soundstück vorher
durch Filter zum dezunieren/interpolieren jagen muss. Da ändert sich
nach dem Filter ja die Länge.
Im ersten Schritt konnte ich jeweils bei dem half und full Interrupt
Callbacks meinen dedizierten DMA Buffer jeweils um 2048 füllen.
bei half die ersten 2048 und beim full die zweiten 2048 aus dem
rohSound.
Das hatte auch noch gut geklappt.
Da ich jetzt aber einen Buffer mit einer varaiblen Größe haben muss kann
ich den oberen Ansatz ja nicht mehr fahren.
Hilfsweise habe ich diesen Ansatz implementiert. Nur scheint es
irgendwie nicht zu klappen, soll heißen, das der Buffer anscheinend
nicht schnell genug gefüllt wird.
1 | #define DMABUFF_SIZE 256
|
2 |
|
3 | uint16_t PlayBuff[4096];
|
4 | uint16_t DMABuff[DMABUFF_SIZE];
|
5 | uint16_t ptrPlayBuff;
|
6 | uint16_t PlayBuffSize = 4096;
|
7 | uint16_t ptrPlayBuffFill;
|
8 | uint16_t fillSize=1024;
|
9 | uint16_t ptrSound=0;
|
10 | uint16_t soundSize=4096;
|
11 |
|
12 | void PlayBuffFill(void);
|
1 | void PlayBuffFill(void)
|
2 | {
|
3 | uint16_t i;
|
4 | for(i=fillSize*ptrPlayBuffFill;i<fillSize*(ptrPlayBuffFill+1);i++)
|
5 | {
|
6 | PlayBuff[i] = sound0[ptrSound];
|
7 | ptrSound++;
|
8 | }
|
9 |
|
10 | PlayBuffSize = fillSize*(ptrPlayBuffFill+1);
|
11 | ptrPlayBuffFill++;
|
12 | if(ptrSound==soundSize)
|
13 | ptrSound=0;
|
14 |
|
15 | }
|
16 |
|
17 |
|
18 | void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s) {
|
19 | uint16_t i;
|
20 |
|
21 | for(i=0;i<(DMABUFF_SIZE/2)-1;i++)
|
22 | {
|
23 | DMABuff[i]=PlayBuff[ptrPlayBuff];
|
24 | ptrPlayBuff++;
|
25 | }
|
26 |
|
27 | if(ptrPlayBuff==PlayBuffSize)
|
28 | ptrPlayBuff=0;
|
29 | PlayBuffFill();
|
30 |
|
31 | }
|
32 |
|
33 | void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s) {
|
34 | uint16_t i;
|
35 |
|
36 | for(i=(DMABUFF_SIZE/2)-1;i<DMABUFF_SIZE;i++)
|
37 | {
|
38 | DMABuff[i]=PlayBuff[ptrPlayBuff];
|
39 | ptrPlayBuff++;
|
40 | }
|
41 | if(ptrPlayBuff==PlayBuffSize)
|
42 | ptrPlayBuff=0;
|
43 |
|
44 |
|
45 | }
|
Der Aufruf in der main sieht so aus, wobei ich den Buffer initial
schonmal fülle
1 | PlayBuffFill();
|
2 | HAL_I2S_Transmit_DMA(&hi2s3,DMABuff ,DMABUFF_SIZE);
|
Was läuft hier eigentlich falsch?
Leider kann ich das nicht erkennen und hoffe hier einen entscheidenden
Hinweis zu bekommen.
Rahmenparameter sind: STMF303 mit 72MHz Systemtakt und I2S mit einer
samplingrate von 8kHz.