-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtundem.c
281 lines (247 loc) · 6.88 KB
/
tundem.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <pthread.h>
#include "tundem.h"
#define DEBUG_INFO
#define WAIT 10 // Number of seconds waiting for frequency locking.
#define MHz 1000000 // Multiplication constant for transform MHz -> Hz
static pthread_cond_t statusCondition = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t statusMutex = PTHREAD_MUTEX_INITIALIZER;
static uint32_t playerHandle;
static uint32_t sourceHandle;
static uint32_t filterHandle;
static uint32_t vStreamHandle;
static uint32_t aStreamHandle;
int32_t freqLockCallback(t_LockStatus status)
{
if (STATUS_ERROR == status)
{
printf("ERROR: Error with Tuner_Register_Status_Callback()!\n");
}
else
{
// Signalize that we locked to frequency.
pthread_mutex_lock(&statusMutex);
pthread_cond_signal(&statusCondition);
pthread_mutex_unlock(&statusMutex);
#ifdef DEBUG_INFO
printf("INFO: Succesfully locked to frequency!\n");
#endif
}
return 0;
}
tundem_error_t initTunerPlayer(uint32_t freq, uint32_t band, t_Module module)
{
struct timespec lockStatusWaitTime;
struct timeval currentTime;
gettimeofday(¤tTime,NULL);
lockStatusWaitTime.tv_sec = currentTime.tv_sec + WAIT;
// Initialize Tuner and check for error.
if (ERROR == Tuner_Init())
{
printf("ERROR: Error with Tuner_Init()!\n");
return TUNDEM_ERROR;
}
// Register callback function and check for error.
if (ERROR == Tuner_Register_Status_Callback(freqLockCallback))
{
printf("ERROR: Error with Tuner_Register_Status_Callback()!\n");
Tuner_Deinit();
return TUNDEM_ERROR;
}
// Lock to frequency and check for error.
if (ERROR == Tuner_Lock_To_Frequency(freq * MHz, band, module))
{
printf("ERROR: Eror with Tuner_Lock_To_Frequency()!\n");
Tuner_Unregister_Status_Callback(freqLockCallback);
Tuner_Deinit();
return TUNDEM_ERROR;
}
// Wait for tuner to lock.
pthread_mutex_lock(&statusMutex);
if (ETIMEDOUT == pthread_cond_timedwait
(&statusCondition, &statusMutex, &lockStatusWaitTime))
{
printf("ERROR: %s lock timeout exceeded!\n", __func__);
Tuner_Deinit();
return TUNDEM_ERROR;
}
pthread_mutex_unlock(&statusMutex);
// Initialize player.
if (NO_ERROR == Player_Init(&playerHandle))
{
#ifdef DEBUG_INFO
printf("INFO: Player_Init() success!\n");
#endif
}
else
{
printf("ERROR: Player_Init() fail!\n");
Tuner_Deinit();
return TUNDEM_ERROR;
}
// Open source.
if (NO_ERROR == Player_Source_Open(playerHandle, &sourceHandle))
{
#ifdef DEBUG_INFO
printf("INFO: Player_Source_Open() success!\n");
#endif
}
else
{
printf("ERROR: Player_Source_Open() fail!\n");
Player_Deinit(playerHandle);
Tuner_Deinit();
return TUNDEM_ERROR;
}
return TUNDEM_NO_ERROR;
}
tundem_error_t deinitTunerPlayer()
{
// Close source.
if (ERROR == Player_Source_Close(playerHandle, sourceHandle))
{
printf("ERROR: Error with Player_Source_Close()!\n");
return TUNDEM_ERROR;
}
// Deinit player.
if (ERROR == Player_Deinit(playerHandle))
{
printf("ERROR: Error with Player_Deinit()!\n");
return TUNDEM_ERROR;
}
// Unregister callback function.
if (ERROR == Tuner_Unregister_Status_Callback(freqLockCallback))
{
printf("ERROR: Error with Tuner_Unregister_Status_Callback()!\n");
return TUNDEM_ERROR;
}
// Deinitialize tuner.
if (ERROR == Tuner_Deinit())
{
printf("ERROR: Error with Tuner_Deinit()!\n");
return TUNDEM_ERROR;
}
return TUNDEM_NO_ERROR;
}
tundem_error_t playStream(uint32_t PID, stream_t type, uint8_t subType)
{
// Proverimo da li je u pitanju video stream.
if (type)
{
if (ERROR == Player_Stream_Create(playerHandle, sourceHandle, PID,
subType, &vStreamHandle))
{
printf("ERROR: Player_Stream_Create() VIDEO fail!\n");
return TUNDEM_ERROR;
}
else
{
#ifdef DEBUG_INFO
printf("INFO: Player_Stream_Create() VIDEO succes!\n");
#endif
return TUNDEM_NO_ERROR;
}
}
// Ili ipak audio stream.
else
{
if (ERROR == Player_Stream_Create(playerHandle, sourceHandle, PID,
subType, &aStreamHandle))
{
printf("ERROR: Player_Stream_Create() AUDIO fail!\n");
return TUNDEM_ERROR;
}
else
{
#ifdef DEBUG_INFO
printf("INFO: Player_Stream_Create() AUDIO succes!\n");
#endif
return TUNDEM_NO_ERROR;
}
}
}
tundem_error_t closeStream(stream_t type)
{
// Proverimo da li je u pitanju video stream.
if (type)
{
if (ERROR == Player_Stream_Remove(playerHandle, sourceHandle,
vStreamHandle))
{
printf("ERROR: Player_Stream_Remove() VIDEO fail!\n");
return TUNDEM_ERROR;
}
else
{
#ifdef DEBUG_INFO
printf("INFO: Player_Stream_Remove() VIDEO succes!\n");
#endif
return TUNDEM_NO_ERROR;
}
}
// Ili je ipak audio stream.
else
{
if (ERROR == Player_Stream_Remove(playerHandle, sourceHandle,
aStreamHandle))
{
printf("ERROR: Player_Stream_Remove() AUDIO fail!\n");
return TUNDEM_ERROR;
}
else
{
#ifdef DEBUG_INFO
printf("INFO: Player_Stream_Remove() AUDIO succes!\n");
#endif
return TUNDEM_NO_ERROR;
}
}
}
tundem_error_t initFilter(uint32_t PID, uint32_t tableID, filter_callback_t callbackFunc)
{
if (ERROR == Demux_Set_Filter(playerHandle, PID, tableID, &filterHandle))
{
printf("ERROR: %s failed to set filter().\n", __func__);
return TUNDEM_ERROR;
}
if (ERROR == Demux_Register_Section_Filter_Callback(callbackFunc))
{
printf("ERROR: %s failed to register callback function.\n", __func__);
return TUNDEM_ERROR;
}
return TUNDEM_NO_ERROR;
}
tundem_error_t deinitFilter(filter_callback_t callbackFunc)
{
if (ERROR == Demux_Unregister_Section_Filter_Callback(callbackFunc))
{
printf("ERROR: %s failed to unregister callback function.\n", __func__);
return TUNDEM_ERROR;
}
if (ERROR == Demux_Free_Filter(playerHandle, filterHandle))
{
printf("ERROR: %s failed to free filter.\n", __func__);
return TUNDEM_ERROR;
}
return TUNDEM_NO_ERROR;
}
tundem_error_t volumeGet(uint32_t *volume)
{
if (ERROR == Player_Volume_Get(playerHandle, volume))
{
printf("ERROR: Player_Volume_Get() breaked.\n");
return TUNDEM_ERROR;
}
return TUNDEM_NO_ERROR;
}
tundem_error_t volumeSet(uint32_t volume)
{
if (ERROR == Player_Volume_Set(playerHandle, volume))
{
printf("ERROR: Player_Volume_Set() breaked.\n");
return TUNDEM_ERROR;
}
return TUNDEM_NO_ERROR;
}