summaryrefslogtreecommitdiff
path: root/amadec/dts_enc.c (plain)
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
17typedef enum {
18 IDLE,
19 TERMINATED,
20 STOPPED,
21 INITTED,
22 ACTIVE,
23 PAUSED,
24} dtsenc_state_t;
25
26typedef 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
34static dtsenc_info_t dtsenc_info;
35static void *dts_enc_loop();
36
37#define DIGITAL_RAW_PATH "sys/class/audiodsp/digital_raw"
38#define FORMAT_PATH "/sys/class/astream/format"
39
40extern int match_types(const char *filetypestr, const char *typesetting);
41
42static 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
52static 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
70static 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}
80int 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}
118int 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}
129int dtsenc_pause()
130{
131 return 0;
132 if (dtsenc_info.state == ACTIVE) {
133 dtsenc_info.state = PAUSED;
134 }
135 return 0;
136}
137int dtsenc_resume()
138{
139 return 0;
140 if (dtsenc_info.state == PAUSED) {
141 dtsenc_info.state = ACTIVE;
142 }
143 return 0;
144}
145int 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}
165int 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
174static 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 }
199quit_loop:
200 adec_print("====dts_enc thread exit success \n");
201 pthread_exit(NULL);
202 return NULL;
203err:
204 adec_print("====dts_enc thread exit success err\n");
205 pthread_exit(NULL);
206 return NULL;
207}
208
209
210