@@ -230,9 +230,10 @@ namespace maix::audio
230
230
uint32_t pcm_flag = PCM_IN | (!param->block ? PCM_NONBLOCK : 0 );
231
231
#ifdef PLATFORM_MAIXCAM
232
232
// Fix segment error when start pcm with channel=2 for the first time.
233
- if (channel != 1 ) {
233
+ if (channel != 1 || sample_rate != 16000 || tinyalsa_format != PCM_FORMAT_S16_LE ) {
234
234
config.channels = 1 ;
235
235
config.rate = 16000 ;
236
+ config.format = PCM_FORMAT_S16_LE;
236
237
param->pcm = pcm_open (param->card , param->device , pcm_flag, &config);
237
238
if (param->pcm == NULL ) {
238
239
err::check_null_raise (param->pcm , " failed to allocate memory for PCM" );
@@ -245,6 +246,7 @@ namespace maix::audio
245
246
pcm_close (param->pcm );
246
247
config.channels = (uint32_t )channel;
247
248
config.rate = (uint32_t )sample_rate;
249
+ config.format = tinyalsa_format;
248
250
}
249
251
#endif
250
252
param->pcm = pcm_open (param->card , param->device , pcm_flag, &config);
@@ -599,6 +601,32 @@ namespace maix::audio
599
601
param->path = path;
600
602
param->block = block;
601
603
uint32_t pcm_flag = PCM_OUT | (!param->block ? PCM_NONBLOCK : 0 );
604
+
605
+ #ifdef PLATFORM_MAIXCAM
606
+ // Fix segment error when start pcm with samplerate=44100 for the first time.
607
+ if (channel != 1 || sample_rate != 16000 || tinyalsa_format != PCM_FORMAT_S16_LE) {
608
+ config.channels = 1 ;
609
+ config.rate = 16000 ;
610
+ config.format = PCM_FORMAT_S16_LE;
611
+ param->pcm = pcm_open (param->card , param->device , pcm_flag, &config);
612
+ if (param->pcm == NULL ) {
613
+ err::check_null_raise (param->pcm , " failed to allocate memory for PCM" );
614
+ } else if (!pcm_is_ready (param->pcm )){
615
+ pcm_close (param->pcm );
616
+ err::check_raise (err::ERR_RUNTIME, " failed to open PCM" );
617
+ }
618
+ pcm_prepare (param->pcm );
619
+ pcm_start (param->pcm );
620
+ uint8_t *data = new uint8_t [320 ];
621
+ pcm_writei (param->pcm , data, 160 );
622
+ delete[] data;
623
+ pcm_drain (param->pcm );
624
+ pcm_close (param->pcm );
625
+ config.channels = (uint32_t )channel;
626
+ config.rate = (uint32_t )sample_rate;
627
+ config.format = tinyalsa_format;
628
+ }
629
+ #endif
602
630
param->pcm = pcm_open (param->card , param->device , pcm_flag, &config);
603
631
if (param->pcm == NULL ) {
604
632
err::check_null_raise (param->pcm , " failed to allocate memory for PCM" );
0 commit comments