@@ -22,6 +22,8 @@ mod app {
22
22
use usb_device:: prelude:: * ;
23
23
use usb_device:: bus:: UsbBusAllocator ;
24
24
25
+ use aligned:: { Aligned , A4 } ;
26
+
25
27
use bbqueue:: {
26
28
BBBuffer ,
27
29
Consumer ,
@@ -38,7 +40,8 @@ mod app {
38
40
const USB_SAMPLE_SIZE : usize = 4 ;
39
41
const SAMPLE_RATE : usize = 96000 ;
40
42
const USB_FRAME_RATE : usize = 1000 ;
41
- const MAX_FRAME_SIZE : usize = CHANNELS * ( USB_SAMPLE_SIZE * SAMPLE_RATE / USB_FRAME_RATE + 1 ) ;
43
+ const MAX_SAMPLES_PER_FRAME : usize = SAMPLE_RATE / USB_FRAME_RATE + 1 ;
44
+ const MAX_FRAME_SIZE : usize = CHANNELS * USB_SAMPLE_SIZE * MAX_SAMPLES_PER_FRAME ;
42
45
const BUFFER_SIZE : usize = MAX_FRAME_SIZE * 2 ;
43
46
44
47
#[ shared]
@@ -137,20 +140,44 @@ mod app {
137
140
}
138
141
}
139
142
143
+ #[ inline( never) ]
144
+ #[ link_section = ".data.sof_timer_handler" ]
145
+ #[ task( binds = TIM2 , priority = 3 , local = [ sof_timer] ) ]
146
+ fn sof_timer_handler ( cx : sof_timer_handler:: Context ) {
147
+ let period = cx. local . sof_timer . get_period_clocks ( ) ;
148
+ defmt:: debug!( "SOF :: {0=14..24}.{0=0..14}" , period) ;
149
+ }
150
+
140
151
#[ inline( never) ]
141
152
#[ link_section = ".data.usb_handler" ]
142
- #[ task( binds = OTG_FS , local = [ producer, usb_dev, usb_audio] ) ]
153
+ #[ task( binds = OTG_FS , priority = 2 , local = [
154
+ producer,
155
+ usb_dev,
156
+ usb_audio,
157
+ usb_audio_buf: Aligned <A4 , [ u8 ; MAX_FRAME_SIZE ] > = Aligned ( [ 0 ; MAX_FRAME_SIZE ] )
158
+ ] ) ]
143
159
fn usb_handler ( cx : usb_handler:: Context ) {
144
160
let producer: & mut bbqueue:: Producer < ' static , BUFFER_SIZE > = cx. local . producer ;
145
161
let usb_dev: & mut UsbDevice < UsbBusType > = cx. local . usb_dev ;
146
162
let usb_audio: & mut SimpleStereoOutput < UsbBusType > = cx. local . usb_audio ;
163
+ let usb_audio_buf = & mut * * cx. local . usb_audio_buf ;
147
164
148
165
// TODO replace this with real USB data
149
166
let bytes_received: usize = MAX_FRAME_SIZE ;
150
167
let data: [ u8 ; MAX_FRAME_SIZE ] = [ 0 ; MAX_FRAME_SIZE ] ;
151
168
let volume_amp: i32 = 1 ;
152
169
153
- while usb_dev. poll ( & mut [ usb_audio] ) {
170
+ usb_dev. poll ( & mut [ usb_audio] ) ;
171
+ if usb_audio. audio_feedback_needed {
172
+ match usb_audio. write_raw_feedback ( 24576 << 6 ) {
173
+ Ok ( _) => defmt:: debug!( "USB :: Feedback OK" ) ,
174
+ Err ( _) => defmt:: warn!( "USB :: Feedback ERR" ) ,
175
+ }
176
+ }
177
+
178
+ if usb_audio. audio_data_available {
179
+ let bytes_received = usb_audio. read_audio_data ( usb_audio_buf) . unwrap ( ) ;
180
+ defmt:: debug!( "USB :: received {} bytes of audio data" , bytes_received) ;
154
181
}
155
182
156
183
//match producer.grant_exact(bytes_received) {
0 commit comments