blob: f95742e1d9f8e4fcb9bcca48cab76cce699ed13d
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <string.h> |
4 | #include <fcntl.h> |
5 | #include <sys/ioctl.h> |
6 | #include <log-print.h> |
7 | #include <pthread.h> |
8 | #include "dts_enc.h" |
9 | #include "dts_transenc_api.h" |
10 | #include <cutils/properties.h> |
11 | #include <amthreadpool.h> |
12 | |
13 | #include "Amsysfsutils.h" |
14 | #include "amconfigutils.h" |
15 | #include "spdif_api.h" |
16 | |
17 | typedef enum { |
18 | IDLE, |
19 | TERMINATED, |
20 | STOPPED, |
21 | INITTED, |
22 | ACTIVE, |
23 | PAUSED, |
24 | } dtsenc_state_t; |
25 | |
26 | typedef struct { |
27 | dtsenc_state_t state; |
28 | pthread_t thread_pid; |
29 | int raw_mode; |
30 | int dts_flag; |
31 | } dtsenc_info_t; |
32 | |
33 | |
34 | static dtsenc_info_t dtsenc_info; |
35 | static void *dts_enc_loop(); |
36 | |
37 | #define DIGITAL_RAW_PATH "sys/class/audiodsp/digital_raw" |
38 | #define FORMAT_PATH "/sys/class/astream/format" |
39 | |
40 | extern int match_types(const char *filetypestr, const char *typesetting); |
41 | |
42 | static int get_dts_mode(void) |
43 | { |
44 | int val = 0; |
45 | char bcmd[28]; |
46 | amsysfs_get_sysfs_str(DIGITAL_RAW_PATH, bcmd, 28); |
47 | val = bcmd[21] & 0xf; |
48 | return val; |
49 | |
50 | } |
51 | |
52 | static int get_dts_format(void) |
53 | { |
54 | char format[21]; |
55 | int len; |
56 | |
57 | format[0] = 0; |
58 | |
59 | amsysfs_get_sysfs_str(FORMAT_PATH, format, 21); |
60 | if (strncmp(format, "NA", 2) == 0) { |
61 | return 0; |
62 | } |
63 | adec_print("amadec format: %s", format); |
64 | if (strncmp(format, "amadec_dts", 10) == 0) { |
65 | return 1; |
66 | } |
67 | return 0; |
68 | } |
69 | |
70 | static int get_cpu_type(void) |
71 | { |
72 | char value[PROPERTY_VALUE_MAX]; |
73 | int ret = property_get("ro.board.platform", value, NULL); |
74 | adec_print("ro.board.platform = %s\n", value); |
75 | if (ret > 0 && match_types("meson6", value)) { |
76 | return 1; |
77 | } |
78 | return 0; |
79 | } |
80 | int dtsenc_init() |
81 | { |
82 | return 0; |
83 | int ret; |
84 | memset(&dtsenc_info, 0, sizeof(dtsenc_info_t)); |
85 | dtsenc_info.dts_flag = get_dts_format(); |
86 | if (!dtsenc_info.dts_flag) { |
87 | return -1; |
88 | } |
89 | dtsenc_info.raw_mode = get_dts_mode(); |
90 | //dtsenc_info.raw_mode=1;//default open |
91 | if (!dtsenc_info.raw_mode) { |
92 | return -1; |
93 | } |
94 | if (!get_cpu_type()) { //if cpu !=m6 ,skip |
95 | return -1; |
96 | } |
97 | |
98 | //adec_print("====dts_flag:%d raw_mode:%d \n",dtsenc_info.dts_flag,dtsenc_info.raw_mode); |
99 | |
100 | ret = dts_transenc_init(); |
101 | if (ret != 1) { |
102 | adec_print("====dts_trancenc init failed \n"); |
103 | return -1; |
104 | } |
105 | dtsenc_info.state = INITTED; |
106 | |
107 | pthread_t tid; |
108 | ret = amthreadpool_pthread_create(&tid, NULL, (void *)dts_enc_loop, NULL); |
109 | if (ret != 0) { |
110 | dtsenc_release(); |
111 | return -1; |
112 | } |
113 | pthread_setname_np(tid, "AmadecDtsEncLP"); |
114 | dtsenc_info.thread_pid = tid; |
115 | adec_print("====dts_enc init success \n"); |
116 | return 0; |
117 | } |
118 | int dtsenc_start() |
119 | { |
120 | return 0; |
121 | int ret; |
122 | if (dtsenc_info.state != INITTED) { |
123 | return -1; |
124 | } |
125 | dtsenc_info.state = ACTIVE; |
126 | adec_print("====dts_enc thread start success \n"); |
127 | return 0; |
128 | } |
129 | int dtsenc_pause() |
130 | { |
131 | return 0; |
132 | if (dtsenc_info.state == ACTIVE) { |
133 | dtsenc_info.state = PAUSED; |
134 | } |
135 | return 0; |
136 | } |
137 | int dtsenc_resume() |
138 | { |
139 | return 0; |
140 | if (dtsenc_info.state == PAUSED) { |
141 | dtsenc_info.state = ACTIVE; |
142 | } |
143 | return 0; |
144 | } |
145 | int dtsenc_stop() |
146 | { |
147 | return 0; |
148 | if (dtsenc_info.state < INITTED) { |
149 | return -1; |
150 | } |
151 | dtsenc_info.state = STOPPED; |
152 | //jone the thread |
153 | if (dtsenc_info.thread_pid <= 0) { |
154 | return -1; |
155 | } |
156 | int ret = amthreadpool_pthread_join(dtsenc_info.thread_pid, NULL); |
157 | dtsenc_info.thread_pid = 0; |
158 | if (dtsenc_info.state != STOPPED) { |
159 | return -1; |
160 | } |
161 | dts_transenc_deinit(); |
162 | adec_print("====dts_enc stop ok\n"); |
163 | return 0; |
164 | } |
165 | int dtsenc_release() |
166 | { |
167 | return 0; |
168 | memset(&dtsenc_info, 0, sizeof(dtsenc_info_t)); |
169 | // dtsenc_info.state=TERMINATED; |
170 | adec_print("====dts_enc release ok\n"); |
171 | return 0; |
172 | } |
173 | |
174 | static void *dts_enc_loop() |
175 | { |
176 | return 0; |
177 | int ret; |
178 | while (1) { |
179 | switch (dtsenc_info.state) { |
180 | case INITTED: |
181 | amthreadpool_thread_usleep(10000); |
182 | continue; |
183 | case ACTIVE: |
184 | break; |
185 | case PAUSED: |
186 | iec958buf_fill_zero(); |
187 | amthreadpool_thread_usleep(100000); |
188 | continue; |
189 | case STOPPED: |
190 | goto quit_loop; |
191 | default: |
192 | goto err; |
193 | } |
194 | //shaoshuai --non_block |
195 | ret = dts_transenc_process_frame(); |
196 | //amthreadpool_thread_usleep(100000); |
197 | //adec_print("====dts_enc thread is running \n"); |
198 | } |
199 | quit_loop: |
200 | adec_print("====dts_enc thread exit success \n"); |
201 | pthread_exit(NULL); |
202 | return NULL; |
203 | err: |
204 | adec_print("====dts_enc thread exit success err\n"); |
205 | pthread_exit(NULL); |
206 | return NULL; |
207 | } |
208 | |
209 | |
210 |