Skip to content

Commit a5e3678

Browse files
committed
* fix player bug
1 parent 9257ba1 commit a5e3678

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

components/voice/port/maixcam/maix_audio_mmf.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,10 @@ namespace maix::audio
230230
uint32_t pcm_flag = PCM_IN | (!param->block ? PCM_NONBLOCK : 0);
231231
#ifdef PLATFORM_MAIXCAM
232232
// 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) {
234234
config.channels = 1;
235235
config.rate = 16000;
236+
config.format = PCM_FORMAT_S16_LE;
236237
param->pcm = pcm_open(param->card, param->device, pcm_flag, &config);
237238
if (param->pcm == NULL) {
238239
err::check_null_raise(param->pcm, "failed to allocate memory for PCM");
@@ -245,6 +246,7 @@ namespace maix::audio
245246
pcm_close(param->pcm);
246247
config.channels = (uint32_t)channel;
247248
config.rate = (uint32_t)sample_rate;
249+
config.format = tinyalsa_format;
248250
}
249251
#endif
250252
param->pcm = pcm_open(param->card, param->device, pcm_flag, &config);
@@ -599,6 +601,32 @@ namespace maix::audio
599601
param->path = path;
600602
param->block = block;
601603
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
602630
param->pcm = pcm_open(param->card, param->device, pcm_flag, &config);
603631
if (param->pcm == NULL) {
604632
err::check_null_raise(param->pcm, "failed to allocate memory for PCM");

examples/audio_demo/main/src/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -603,9 +603,9 @@ int _main(int argc, char* argv[])
603603

604604
log::info("Playback %s\r\n", path.c_str());
605605
audio::Player p = audio::Player(path, sample_rate, format, channel, block);
606-
err::check_bool_raise(p.sample_rate() == sample_rate);
607-
err::check_bool_raise(p.format() == format);
608-
err::check_bool_raise(p.channel() == channel);
606+
log::info("player sample rate:%d", p.sample_rate());
607+
log::info("player channel:%d", p.channel());
608+
log::info("player format:%d", p.format());
609609
if (!block) {
610610
log::info("Set period count:%d", p.period_count(20));
611611
}

0 commit comments

Comments
 (0)