@@ -36,24 +36,24 @@ static int16_t * audio_buffer;
36
36
int audio_open (uint32_t samples ) {
37
37
volatile uint32_t * ptr ;
38
38
39
+ max_samples = samples * 2 ;
40
+
39
41
for (int i = 0 ; i < 2 ; i ++ ) {
40
42
if (dma_buffer [i ] != NULL ) {
41
43
free (dma_buffer [i ]);
42
44
}
43
- dma_buffer [i ] = (unsigned char * )malloc (samples * 2 * 4 + 15 );
45
+ dma_buffer [i ] = (unsigned char * )malloc (max_samples * 4 + 15 );
44
46
if (dma_buffer [i ] == NULL ) {
45
47
return -1 ;
46
48
}
47
- memset (dma_buffer [i ], 0 , samples * 2 * 4 + 15 );
49
+ memset (dma_buffer [i ], 0 , max_samples * 4 + 15 );
48
50
}
49
51
50
- audio_buffer = (int16_t * )malloc (samples * 2 * 2 );
52
+ audio_buffer = (int16_t * )malloc (max_samples * 2 );
51
53
if (audio_buffer == NULL ) {
52
54
return -1 ;
53
55
}
54
- memset (audio_buffer , 0 , samples * 2 * 2 );
55
-
56
- max_samples = samples ;
56
+ memset (audio_buffer , 0 , max_samples * 2 );
57
57
58
58
ptr = (uint32_t * ) (GPIO_BASE + GPIO_GPFSEL4 );
59
59
* ptr = GPIO_FSEL0_ALT0 + GPIO_FSEL5_ALT0 ;
@@ -74,19 +74,15 @@ int audio_open(uint32_t samples) {
74
74
PWM -> rng1 = PWM -> rng2 = 11336 ;
75
75
76
76
for (int i = 0 ; i < 2 ; i ++ ) {
77
- uint32_t source_ad = (uint32_t ) dma_buffer [i ];
78
- while ((source_ad & 0xF ) != 0 ) {
79
- source_ad ++ ;
80
- }
81
77
dma_cb [i ].ti = DMA_DEST_DREQ | DMA_PERMAP_5 | DMA_SRC_INC | DMA_INTEN ;
82
- dma_cb [i ].source_ad = 0x40000000 + source_ad ;
83
- dma_cb [i ].dest_ad = 0x7E000000 | 0x20C000 | 0x18 ;
84
- dma_cb [i ].txfr_len = samples * 2 * 4 ;
78
+ dma_cb [i ].source_ad = 0x40000000 | ((( uint32_t ) dma_buffer [ i ] + 15 ) & ~ 0xf ) ;
79
+ dma_cb [i ].dest_ad = 0x7E000000 | PWM_BASE | PWM_FIF1 ;
80
+ dma_cb [i ].txfr_len = max_samples * 4 ;
85
81
dma_cb [i ].stride = 0 ;
86
82
dma_cb [i ].nextconbk = 0 ;
87
83
}
88
84
89
- PWM -> dmac = PWM_ENAB | 0x0001 ; // PWM DMA Enable
85
+ PWM -> dmac = PWM_ENAB | 0x0008 ; // PWM DMA Enable
90
86
PWM -> ctl = PWM_USEF2 | PWM_PWEN2 | PWM_USEF1 | PWM_PWEN1 | PWM_CLRF1 ;
91
87
92
88
cur_buffer = 0 ;
@@ -123,6 +119,10 @@ int audio_get_sample_size() {
123
119
void audio_play () {
124
120
uint32_t data ;
125
121
122
+ for (int i = 0 ; i < 2 ; i ++ ) {
123
+ memset (dma_buffer [i ], 0 , max_samples * 4 + 15 );
124
+ }
125
+
126
126
IRQ -> irq1Enable = INTERRUPT_DMA0 ;
127
127
128
128
DMA -> enable = DMA_EN0 ; // Set DMA Channel 0 Enable Bit
@@ -144,7 +144,6 @@ void audio_play() {
144
144
145
145
void audio_stop () {
146
146
IRQ -> irq1Disable = INTERRUPT_DMA0 ;
147
- DMA -> ch [0 ].cs = DMA_RESET ;
148
147
}
149
148
150
149
void audio_dma_irq () {
@@ -176,25 +175,18 @@ uint32_t audio_write(int16_t * stream, uint32_t samples) {
176
175
* write_ptr ++ = data >> SAMPLE_SHIFT ;
177
176
write_size ++ ;
178
177
written ++ ;
179
- }
180
-
181
- if (write_size >= max_samples ) {
182
- while ((DMA -> ch [0 ].cs & DMA_ACTIVE ) != 0 )
183
- ;
184
178
185
- DMA -> enable = DMA_EN0 ;
186
- DMA -> ch [0 ].conblk_ad = 0x40000000 | ( uint32_t ) & dma_cb [ cur_buffer ];
187
- DMA -> ch [ 0 ]. cs = DMA_ACTIVE ;
179
+ if ( write_size >= max_samples ) {
180
+ while (( DMA -> ch [0 ].cs & DMA_ACTIVE ) != 0 )
181
+ ;
188
182
189
- cur_buffer = cur_buffer == 0 ? 1 : 0 ;
190
- write_ptr = (uint32_t * ) dma_cb [cur_buffer ]. source_ad ;
191
- write_size = 0 ;
183
+ DMA -> enable = DMA_EN0 ;
184
+ DMA -> ch [ 0 ]. conblk_ad = 0x40000000 | (uint32_t ) & dma_cb [cur_buffer ];
185
+ DMA -> ch [ 0 ]. cs = DMA_ACTIVE ;
192
186
193
- while (write_size < max_samples && written < samples ) {
194
- data = * stream ++ + 32768 ;
195
- * write_ptr ++ = data >> SAMPLE_SHIFT ;
196
- write_size ++ ;
197
- written ++ ;
187
+ cur_buffer = cur_buffer == 0 ? 1 : 0 ;
188
+ write_ptr = (uint32_t * )dma_cb [cur_buffer ].source_ad ;
189
+ write_size = 0 ;
198
190
}
199
191
}
200
192
0 commit comments