23
23
#ifdef TARGET_STM
24
24
25
25
#include " PDM.h"
26
- #include " audio.h"
27
26
#include " mbed.h"
27
+ extern " C" {
28
+ #include " audio.h"
29
+ }
28
30
29
- #define AUDIO_FREQUENCY BSP_AUDIO_FREQUENCY_16K
30
- #define AUDIO_IN_PDM_BUFFER_SIZE (uint32_t )(128 )
31
-
32
- // ALIGN_32BYTES (uint16_t recordPDMBuf[AUDIO_IN_PDM_BUFFER_SIZE]) __attribute__((section(".OPEN_AMP_SHMEM")));
33
- // FIXME: need to add an entry for RAM_D3 to linker script
34
- uint16_t * recordPDMBuf = (uint16_t *)0x38000000 ;
31
+ extern " C" uint16_t *g_pcmbuf;
35
32
36
33
PDMClass::PDMClass (int dinPin, int clkPin, int pwrPin) :
37
34
_dinPin(dinPin),
@@ -45,14 +42,10 @@ PDMClass::~PDMClass()
45
42
{
46
43
}
47
44
48
- int PDMClass::begin (int channels, long sampleRate) {
49
-
50
- _channels = channels;
51
-
52
- // fixme: only works in stereo mode
53
- channels = 2 ;
45
+ static int gain_db = -1 ;
46
+ static int _samplerate = -1 ;
54
47
55
- setBufferSize (AUDIO_IN_PDM_BUFFER_SIZE / 4 * channels);
48
+ int PDMClass::begin ( int channels, long sampleRate) {
56
49
57
50
if (isBoardRev2 ()) {
58
51
mbed::I2C i2c (PB_7, PB_6);
@@ -69,43 +62,36 @@ int PDMClass::begin(int channels, long sampleRate) {
69
62
i2c.write (8 << 1 , data, sizeof (data));
70
63
}
71
64
72
- BSP_AUDIO_IN_SelectInterface (AUDIO_IN_INTERFACE_PDM);
65
+ _channels = channels;
66
+ _samplerate = sampleRate;
73
67
74
- /* Initialize audio IN at REC_FREQ*/
75
- if (BSP_AUDIO_IN_InitEx (INPUT_DEVICE_DIGITAL_MIC, AUDIO_FREQUENCY, DEFAULT_AUDIO_IN_BIT_RESOLUTION, channels) != AUDIO_OK)
76
- {
77
- return 0 ;
68
+ if (gain_db == -1 ) {
69
+ gain_db = 24 ;
78
70
}
79
71
80
- /* Start the record */
81
- BSP_AUDIO_IN_Record ((uint16_t *)recordPDMBuf, AUDIO_IN_PDM_BUFFER_SIZE * channels);
82
- return 1 ;
72
+ // g_pcmbuf = (uint16_t*)_doubleBuffer.data();
73
+
74
+ if (py_audio_init (channels, sampleRate, gain_db, 0 .9883f )) {
75
+ py_audio_start_streaming ();
76
+ return 1 ;
77
+ }
78
+ return 0 ;
83
79
}
84
80
85
81
void PDMClass::end ()
86
82
{
83
+ py_audio_stop_streaming ();
84
+ py_audio_deinit ();
87
85
}
88
86
89
87
int PDMClass::available ()
90
88
{
91
89
size_t avail = _doubleBuffer.available ();
92
- if (_channels == 1 ) {
93
- return avail/2 ;
94
- } else {
95
- return avail;
96
- }
90
+ return avail;
97
91
}
98
92
99
93
int PDMClass::read (void * buffer, size_t size)
100
94
{
101
- if (_channels == 1 ) {
102
- uint16_t temp[size*2 ];
103
- int read = _doubleBuffer.read (temp, size*2 );
104
- for (int i = 0 ; i < size; i++) {
105
- ((uint16_t *)buffer)[i] = temp[i*2 ];
106
- }
107
- return read ;
108
- }
109
95
int read = _doubleBuffer.read (buffer, size);
110
96
return read ;
111
97
}
@@ -117,7 +103,9 @@ void PDMClass::onReceive(void(*function)(void))
117
103
118
104
void PDMClass::setGain (int gain)
119
105
{
120
-
106
+ gain_db = gain;
107
+ // end();
108
+ // begin(_channels, _samplerate);
121
109
}
122
110
123
111
void PDMClass::setBufferSize (int bufferSize)
@@ -127,49 +115,28 @@ void PDMClass::setBufferSize(int bufferSize)
127
115
128
116
void PDMClass::IrqHandler (bool halftranfer)
129
117
{
130
-
131
- int start = halftranfer ? 0 : AUDIO_IN_PDM_BUFFER_SIZE;
132
-
133
- if (BSP_AUDIO_IN_GetInterface () == AUDIO_IN_INTERFACE_PDM && _doubleBuffer.available () == 0 ) {
134
-
135
- /* Invalidate Data Cache to get the updated content of the SRAM*/
136
- SCB_InvalidateDCache_by_Addr ((uint32_t *)&recordPDMBuf[start], AUDIO_IN_PDM_BUFFER_SIZE * 2 );
137
-
138
- // memcpy((uint16_t*)_doubleBuffer.data(), (uint16_t*)&recordPDMBuf[start], AUDIO_IN_PDM_BUFFER_SIZE/2);
139
- BSP_AUDIO_IN_PDMToPCM ((uint16_t *)&recordPDMBuf[start], (uint16_t *)_doubleBuffer.data ());
140
-
141
- /* Clean Data Cache to update the content of the SRAM */
142
- SCB_CleanDCache_by_Addr ((uint32_t *)_doubleBuffer.data (), AUDIO_IN_PDM_BUFFER_SIZE * 2 );
143
-
118
+ if (_doubleBuffer.available () == 0 ) {
119
+ g_pcmbuf = (uint16_t *)_doubleBuffer.data ();
120
+ audio_pendsv_callback ();
144
121
_doubleBuffer.swap (_doubleBuffer.availableForWrite ());
145
122
}
123
+
146
124
if (_onReceive) {
147
125
_onReceive ();
148
126
}
149
127
}
150
128
151
129
extern " C" {
152
- /* *
153
- @brief Calculates the remaining file size and new position of the pointer.
154
- @param None
155
- @retval None
156
- */
157
- __attribute__ ((__used__)) void BSP_AUDIO_IN_TransferComplete_CallBack(void )
158
- {
159
- PDM.IrqHandler (false );
160
- }
130
+ void PDMIrqHandler (bool halftranfer)
131
+ {
132
+ PDM.IrqHandler (halftranfer);
133
+ }
161
134
162
- /* *
163
- @brief Manages the DMA Half Transfer complete interrupt.
164
- @param None
165
- @retval None
166
- */
167
- __attribute__ ((__used__)) void BSP_AUDIO_IN_HalfTransfer_CallBack(void )
168
- {
169
- PDM.IrqHandler (true );
170
- }
135
+ void PDMsetBufferSize (int size) {
136
+ PDM.setBufferSize (size);
137
+ }
171
138
}
172
139
173
140
PDMClass PDM (0 , 0 , 0 );
174
141
175
- #endif
142
+ #endif
0 commit comments