1+ /*
2+ * Copyright (c) 2006-2025 RT-Thread Development Team
3+ *
4+ * SPDX-License-Identifier: Apache-2.0
5+ *
6+ * Change Logs:
7+ * Date Author Notes
8+ * 2025-05-01 wumingzi first version
9+ */
10+
11+ #include "utest.h"
12+ #include "common.h"
13+ #include <string.h>
14+
15+ static rt_device_t dev_obj ; /* Audio device handler */
16+
17+ /* Allocate and initialize memory filled by fill_byte */
18+ static void * alloc_filled_mem (rt_uint8_t fill_byte , size_t size )
19+ {
20+ void * ptr = malloc (size );
21+ if (ptr != NULL )
22+ {
23+ memset (ptr , fill_byte , size );
24+ }
25+ return ptr ;
26+ }
27+
28+ /* Check if the memory is filled with fill_byte */
29+ static rt_err_t check_filled_mem (rt_uint8_t fill_byte , rt_uint8_t * mem , size_t size )
30+ {
31+ rt_uint8_t * p = mem ;
32+ for (size_t i = 0 ; i < size ; ++ i )
33+ {
34+ if (p [i ] != fill_byte )
35+ {
36+ return - RT_ERROR ;
37+ }
38+ }
39+ return RT_EOK ;
40+ }
41+
42+ static void player_test (void )
43+ {
44+ int fd = -1 ;
45+ int res = 0 ;
46+ uint8_t * buffer = NULL ;
47+ void * player_buffer = NULL ;struct rt_audio_caps caps = {0 };
48+
49+ dev_obj = rt_device_find (SOUND_PLAYER_DEVICE_NAME );
50+ if (dev_obj == RT_NULL )
51+ {
52+ uassert_not_null (dev_obj );
53+ goto __exit ;
54+ }
55+ if (dev_obj -> type != RT_Device_Class_Sound )
56+ {
57+ LOG_I ("Not an audio device!\n" );
58+ goto __exit ;
59+ }
60+
61+ res = rt_device_open (dev_obj , RT_DEVICE_OFLAG_WRONLY );
62+ if (res != RT_EOK )
63+ {
64+ uassert_true (0 );
65+ goto __exit ;
66+ }
67+
68+ /* The sampling rate is set by the driver default, so there isn't configuration step */
69+
70+ struct rt_audio_device * audio_dev = (struct rt_audio_device * )dev_obj ;
71+
72+ while (1 )
73+ {
74+ rt_thread_mdelay (500 );
75+ /* Init playerbuffer, it has 2 data blocks*/
76+ player_buffer = alloc_filled_mem (0xAA , BUFSZ );
77+ rt_device_write (dev_obj , 0 , player_buffer , BUFSZ );
78+ player_buffer = alloc_filled_mem (0x55 , BUFSZ );
79+ rt_device_write (dev_obj , BUFSZ , player_buffer , BUFSZ );
80+
81+ struct rt_audio_buf_info buf_info = audio_dev -> replay -> buf_info ;
82+
83+ /* Check whether blocks is filled correctly */
84+ res = check_filled_mem (0xAA , & buf_info .buffer [0 ], BUFSZ );
85+ if (res != RT_EOK )
86+ {
87+ LOG_I ("Memory filled check init failurein player_test!\n" );
88+ uassert_true (0 );
89+ goto __exit ;
90+ }
91+ res = check_filled_mem (0x55 , & buf_info .buffer [BUFSZ ], BUFSZ );
92+ if (res != RT_EOK )
93+ {
94+ LOG_I ("Memory filled check init failure in player_test!\n" );
95+ uassert_true (0 );
96+ goto __exit ;
97+ }
98+ rt_thread_mdelay (1500 );
99+
100+ /* Cover the first data block with 0x55 */
101+ player_buffer = alloc_filled_mem (0x55 , BUFSZ );
102+ rt_device_write (dev_obj , 0 , player_buffer , BUFSZ );
103+ /* Check rt_audio_rx_done is working properly or not. If it's working, the first block
104+ * in &buf_info->buffer will remained the value, 0x55 */
105+ res = check_filled_mem (0x55 , & buf_info .buffer [0 ], BUFSZ );
106+ if (res != RT_EOK )
107+ {
108+ LOG_I ("Memory filled check init failure in player_test!\n" );
109+ uassert_true (0 );
110+ goto __exit ;
111+ }
112+ }
113+
114+ rt_device_close (dev_obj );
115+
116+ __exit :
117+
118+ if (buffer )
119+ rt_free (buffer );
120+
121+ if (player_buffer )
122+ rt_free (player_buffer );
123+ }
124+
125+ static void mic_test (void )
126+ {
127+ int fd = -1 ;
128+ int res = 0 ;
129+ uint8_t * mic_buffer = NULL ;
130+ struct rt_audio_caps caps = {0 };
131+ int length , total_length = 0 ;
132+
133+ mic_buffer = rt_malloc (RX_DMA_FIFO_SIZE );
134+ if (mic_buffer == RT_NULL )
135+ goto __exit ;
136+
137+ dev_obj = rt_device_find (SOUND_MIC_DEVICE_NAME );
138+ if (dev_obj == RT_NULL )
139+ goto __exit ;
140+
141+ rt_device_open (dev_obj , RT_DEVICE_OFLAG_RDONLY );
142+
143+ rt_device_control (dev_obj , AUDIO_CTL_CONFIGURE , & caps );
144+
145+ while (1 )
146+ {
147+ struct rt_audio_device * audio_dev = (struct rt_audio_device * )dev_obj ;
148+ struct mic_device * mic_dev = (struct mic_device * )audio_dev -> parent .user_data ;
149+
150+ /* Delay for preparing the data(0xAA) provided by driver */
151+ rt_thread_mdelay (500 );
152+ length = rt_device_read (dev_obj , 0 , mic_buffer , RX_DMA_FIFO_SIZE );
153+ /* Check the memory has been changed whether or not */
154+ res = check_filled_mem (0x55 , (rt_uint8_t * )(& mic_dev -> rx_fifo [0 ]), length );
155+ if (res != RT_EOK )
156+ {
157+ LOG_I ("Memory filled check init failure in mic_test!\n" );
158+ uassert_true (0 );
159+ goto __exit ;
160+ }
161+ /* Delay for changing the data from 0xAA to 0x55 provided by driver */
162+ rt_thread_mdelay (1000 );
163+ length = rt_device_read (dev_obj , 0 , mic_buffer , RX_DMA_FIFO_SIZE );
164+ res = check_filled_mem (0x55 , (rt_uint8_t * )(& mic_dev -> rx_fifo [0 ]), length );
165+ if (res != RT_EOK )
166+ {
167+ LOG_I ("Memory filled check init failure in mic_test!\n" );
168+ uassert_true (0 );
169+ goto __exit ;
170+ }
171+ }
172+
173+ rt_device_close (dev_obj );
174+
175+ __exit :
176+ if (mic_buffer )
177+ rt_free (mic_buffer );
178+ }
179+
180+ static void testcase (void )
181+ {
182+ UTEST_UNIT_RUN (player_test );
183+ UTEST_UNIT_RUN (mic_test );
184+ }
185+
186+ static rt_err_t utest_tc_init (void )
187+ {
188+ return RT_EOK ;
189+ }
190+
191+ static rt_err_t utest_tc_cleanup (void )
192+ {
193+ return RT_EOK ;
194+ }
195+
196+ UTEST_TC_EXPORT (testcase , "testcases.drivers.audio.audio_tc" , utest_tc_init , utest_tc_cleanup , 10 );
0 commit comments