1+ #pragma once
2+
3+ #include "v3_common.h"
4+
5+ #define V3_AUD_CHN_NUM 2
6+
7+ typedef enum {
8+ V3_AUD_BIT_8 ,
9+ V3_AUD_BIT_16 ,
10+ V3_AUD_BIT_24
11+ } v3_aud_bit ;
12+
13+ typedef enum {
14+ V3_AUD_INTF_I2S_MASTER ,
15+ V3_AUD_INTF_I2S_SLAVE ,
16+ V3_AUD_INTF_PCM_SLAVE_STD ,
17+ V3_AUD_INTF_PCM_SLAVE_NSTD ,
18+ V3_AUD_INTF_PCM_MASTER_STD ,
19+ V3_AUD_INTF_PCM_MASTER_NSTD ,
20+ V3_AUD_INTF_END
21+ } v3_aud_intf ;
22+
23+ typedef struct {
24+ // Accept industry standards from
25+ // 8000 to 96000Hz, plus 64000Hz
26+ int rate ;
27+ v3_aud_bit bit ;
28+ v3_aud_intf intf ;
29+ int stereoOn ;
30+ // 8-to-16 bit, expand mode
31+ int expandOn ;
32+ unsigned int frmNum ;
33+ unsigned int packNumPerFrm ;
34+ unsigned int chnNum ;
35+ unsigned int syncRxClkOn ;
36+ } v3_aud_cnf ;
37+
38+ typedef struct {
39+ v3_aud_bit bit ;
40+ int stereoOn ;
41+ void * addr [2 ];
42+ unsigned int phy [2 ];
43+ unsigned long long timestamp ;
44+ unsigned int sequence ;
45+ unsigned int length ;
46+ unsigned int poolId [2 ];
47+ } v3_aud_frm ;
48+
49+ typedef struct {
50+ v3_aud_frm frame ;
51+ char isValid ;
52+ char isSysBound ;
53+ } v3_aud_efrm ;
54+
55+ typedef struct {
56+ void * handle , * handleGoke ;
57+
58+ int (* fnDisableDevice )(int device );
59+ int (* fnEnableDevice )(int device );
60+ int (* fnSetDeviceConfig )(int device , v3_aud_cnf * config );
61+
62+ int (* fnDisableChannel )(int device , int channel );
63+ int (* fnEnableChannel )(int device , int channel );
64+
65+ int (* fnFreeFrame )(int device , int channel , v3_aud_frm * frame , v3_aud_efrm * encFrame );
66+ int (* fnGetFrame )(int device , int channel , v3_aud_frm * frame , v3_aud_efrm * encFrame , int millis );
67+ } v3_aud_impl ;
68+
69+ static int v3_aud_load (v3_aud_impl * aud_lib ) {
70+ if (!(aud_lib -> handle = dlopen ("libmpi.so" , RTLD_LAZY | RTLD_GLOBAL ))) {
71+ fprintf (stderr , "[v3_aud] Failed to load library!\nError: %s\n" , dlerror ());
72+ return EXIT_FAILURE ;
73+ }
74+
75+ if (!(aud_lib -> fnDisableDevice = (int (* )(int device ))
76+ dlsym (aud_lib -> handle , "HI_MPI_AI_Disable" ))) {
77+ fprintf (stderr , "[v3_aud] Failed to acquire symbol HI_MPI_AI_Disable!\n" );
78+ return EXIT_FAILURE ;
79+ }
80+
81+ if (!(aud_lib -> fnEnableDevice = (int (* )(int device ))
82+ dlsym (aud_lib -> handle , "HI_MPI_AI_Enable" ))) {
83+ fprintf (stderr , "[v3_aud] Failed to acquire symbol HI_MPI_AI_Enable!\n" );
84+ return EXIT_FAILURE ;
85+ }
86+
87+ if (!(aud_lib -> fnSetDeviceConfig = (int (* )(int device , v3_aud_cnf * config ))
88+ dlsym (aud_lib -> handle , "HI_MPI_AI_SetPubAttr" ))) {
89+ fprintf (stderr , "[v3_aud] Failed to acquire symbol HI_MPI_AI_SetPubAttr!\n" );
90+ return EXIT_FAILURE ;
91+ }
92+
93+ if (!(aud_lib -> fnDisableChannel = (int (* )(int device , int channel ))
94+ dlsym (aud_lib -> handle , "HI_MPI_AI_DisableChn" ))) {
95+ fprintf (stderr , "[v3_aud] Failed to acquire symbol HI_MPI_AI_DisableChn!\n" );
96+ return EXIT_FAILURE ;
97+ }
98+
99+ if (!(aud_lib -> fnEnableChannel = (int (* )(int device , int channel ))
100+ dlsym (aud_lib -> handle , "HI_MPI_AI_EnableChn" ))) {
101+ fprintf (stderr , "[v3_aud] Failed to acquire symbol HI_MPI_AI_EnableChn!\n" );
102+ return EXIT_FAILURE ;
103+ }
104+
105+ if (!(aud_lib -> fnFreeFrame = (int (* )(int device , int channel , v3_aud_frm * frame , v3_aud_efrm * encFrame ))
106+ dlsym (aud_lib -> handle , "HI_MPI_AI_ReleaseFrame" ))) {
107+ fprintf (stderr , "[v3_aud] Failed to acquire symbol HI_MPI_AI_ReleaseFrame!\n" );
108+ return EXIT_FAILURE ;
109+ }
110+
111+ if (!(aud_lib -> fnGetFrame = (int (* )(int device , int channel , v3_aud_frm * frame , v3_aud_efrm * encFrame , int millis ))
112+ dlsym (aud_lib -> handle , "HI_MPI_AI_GetFrame" ))) {
113+ fprintf (stderr , "[v3_aud] Failed to acquire symbol HI_MPI_AI_GetFrame!\n" );
114+ return EXIT_FAILURE ;
115+ }
116+
117+ return EXIT_SUCCESS ;
118+ }
119+
120+ static void v3_aud_unload (v3_aud_impl * aud_lib ) {
121+ if (aud_lib -> handle ) dlclose (aud_lib -> handle );
122+ aud_lib -> handle = NULL ;
123+ if (aud_lib -> handleGoke ) dlclose (aud_lib -> handleGoke );
124+ aud_lib -> handleGoke = NULL ;
125+ memset (aud_lib , 0 , sizeof (* aud_lib ));
126+ }
0 commit comments