Skip to content

Commit d9b8a0e

Browse files
Renjianguang-mixiaoxiang781216
authored andcommitted
drivertest: Fix drivertest_audio crash
1.call AUDIOIOC_RELEASE when finished 2.make sure the driver dequeue all buffers before free the buffers Signed-off-by: renjianguang <[email protected]>
1 parent 4d9f2e3 commit d9b8a0e

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

testing/drivertest/drivertest_audio.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,12 @@ static int audio_test_cleanup(FAR struct audio_state_s *state, int direction)
511511

512512
ioctl(fd, AUDIOIOC_UNREGISTERMQ, (unsigned long)state->mq);
513513

514+
#ifdef CONFIG_AUDIO_MULTI_SESSION
515+
ioctl(fd, AUDIOIOC_RELEASE, (unsigned long)state->session);
516+
#else
517+
ioctl(fd, AUDIOIOC_RELEASE, 0);
518+
#endif
519+
514520
if (state->out_fd >= 0)
515521
{
516522
close(state->out_fd);
@@ -535,6 +541,7 @@ static void audio_test_case(void **audio_state)
535541
};
536542

537543
struct mq_attr attr;
544+
int unconsumed = 0;
538545
unsigned int prio;
539546
bool streaming;
540547
bool running;
@@ -596,6 +603,8 @@ static void audio_test_case(void **audio_state)
596603
printf("Start %s. \n", direct == AUDIO_TYPE_OUTPUT ?
597604
"Playback" : "Capture");
598605

606+
unconsumed = buf_info.nbuffers;
607+
599608
while (running)
600609
{
601610
ret = mq_receive(state->mq, (FAR char *)&msg, sizeof(msg), &prio);
@@ -607,6 +616,7 @@ static void audio_test_case(void **audio_state)
607616
switch (msg.msg_id)
608617
{
609618
case AUDIO_MSG_DEQUEUE:
619+
unconsumed--;
610620
if (streaming)
611621
{
612622
if (direct == AUDIO_TYPE_INPUT)
@@ -627,11 +637,15 @@ static void audio_test_case(void **audio_state)
627637
ret = audio_test_enqueuebuffer(state,
628638
msg.u.ptr, direct);
629639
if (ret != OK)
630-
{
631-
close(state->out_fd);
632-
state->out_fd = -1;
633-
streaming = false;
634-
}
640+
{
641+
close(state->out_fd);
642+
state->out_fd = -1;
643+
streaming = false;
644+
}
645+
else
646+
{
647+
unconsumed++;
648+
}
635649
}
636650
}
637651
break;
@@ -659,12 +673,16 @@ static void audio_test_case(void **audio_state)
659673
ret = mq_getattr(state->mq, &attr);
660674
assert_false(ret < 0);
661675

662-
if (attr.mq_curmsgs == 0)
663-
{
664-
break;
665-
}
676+
if (attr.mq_curmsgs == 0 && unconsumed <= 0)
677+
{
678+
break;
679+
}
666680

667681
mq_receive(state->mq, (FAR char *)&msg, sizeof(msg), &prio);
682+
if (msg.msg_id == AUDIO_MSG_DEQUEUE)
683+
{
684+
unconsumed--;
685+
}
668686
}
669687
while (ret >= 0);
670688

0 commit comments

Comments
 (0)