1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00
vdr/dvbapi.c

285 lines
6.2 KiB
C

/*
* dvbapi.c: Interface to the DVB driver
*
* See the main source file 'osm.c' for copyright information and
* how to reach the author.
*
* $Id: dvbapi.c 1.2 2000/03/11 10:39:09 kls Exp $
*/
#include "dvbapi.h"
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "interface.h"
#include "tools.h"
#define VIDEODEVICE "/dev/video"
const char *DvbQuality = "LMH"; // Low, Medium, High
bool DvbSetChannel(int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid)
{
int v = open(VIDEODEVICE, O_RDWR);
if (v >= 0) {
struct frontend front;
ioctl(v, VIDIOCGFRONTEND, &front);
unsigned int freq = FrequencyMHz;
front.ttk = (freq < 11800UL) ? 0 : 1;
if (freq < 11800UL)
freq -= 9750UL;
else
freq -= 10600UL;
front.freq = freq * 1000000UL;
front.diseqc = Diseqc;
front.srate = Srate * 1000;
front.volt = (Polarization == 'v') ? 0 : 1;
front.video_pid = Vpid;
front.audio_pid = Apid;
front.AFC = 1;
ioctl(v, VIDIOCSFRONTEND, &front);
close(v);
if (front.sync & 0x1F == 0x1F)
return true;
esyslog(LOG_ERR, "channel not sync'ed (front.sync=%X)!", front.sync);
}
else
Interface.Error("can't open VIDEODEVICE");//XXX
return false;
}
// -- cDvbRecorder -----------------------------------------------------------
cDvbRecorder::cDvbRecorder(void)
{
recording = false;
}
cDvbRecorder::~cDvbRecorder()
{
Stop();
}
bool cDvbRecorder::Recording(void)
{
return recording;
}
bool cDvbRecorder::Record(const char *FileName, char Quality)
{
isyslog(LOG_INFO, "record %s (%c)", FileName, Quality);
if (MakeDirs(FileName)) {
FILE *f = fopen(FileName, "a");
if (f) {
fprintf(f, "%s, %c\n", FileName, Quality);
fclose(f);
recording = true;
// TODO
Interface.Error("Recording not yet implemented!");
return true;
}
else {
Interface.Error("Can't write to file!");
return false;
}
}
// TODO
return false;
}
bool cDvbRecorder::Play(const char *FileName, int Frame)
{
if (!recording) {
isyslog(LOG_INFO, "play %s (%d)", FileName, Frame);
// TODO
Interface.Error("Playback not yet implemented!");
return true;
}
return false;
}
bool cDvbRecorder::FastForward(void)
{
isyslog(LOG_INFO, "fast forward");
// TODO
return false;
}
bool cDvbRecorder::FastRewind(void)
{
isyslog(LOG_INFO, "fast rewind");
// TODO
return false;
}
bool cDvbRecorder::Pause(void)
{
isyslog(LOG_INFO, "pause");
// TODO
return false;
}
void cDvbRecorder::Stop(void)
{
isyslog(LOG_INFO, "stop");
recording = false;
// TODO
}
int cDvbRecorder::Frame(void)
{
isyslog(LOG_INFO, "frame");
// TODO
return 0;
}
// --- cDvbOsd ---------------------------------------------------------------
cDvbOsd::cDvbOsd(void)
{
cols = rows = 0;
#ifdef DEBUG_OSD
memset(&colorPairs, 0, sizeof(colorPairs));
initscr();
start_color();
keypad(stdscr, TRUE);
nonl();
cbreak();
noecho();
timeout(1000);
leaveok(stdscr, TRUE);
window = stdscr;
#endif
#ifdef DEBUG_REMOTE
initscr();
keypad(stdscr, TRUE);
nonl();
cbreak();
noecho();
timeout(1000);
#endif
}
cDvbOsd::~cDvbOsd()
{
Close();
}
#ifdef DEBUG_OSD
void cDvbOsd::SetColor(eDvbColor colorFg, eDvbColor colorBg)
{
int color = (colorBg << 16) | colorFg | 0x80000000;
for (int i = 0; i < MaxColorPairs; i++) {
if (!colorPairs[i]) {
colorPairs[i] = color;
init_pair(i + 1, colorFg, colorBg);
wattrset(window, COLOR_PAIR(i + 1));
break;
}
else if (color == colorPairs[i]) {
wattrset(window, COLOR_PAIR(i + 1));
break;
}
}
}
#else
void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
{
int v = open(VIDEODEVICE, O_RDWR);
if (v >= 0) {
struct drawcmd dc;
dc.cmd = cmd;
dc.color = color;
dc.x0 = x0;
dc.y0 = y0;
dc.x1 = x1;
dc.y1 = y1;
dc.data = (void *)data;
ioctl(v, VIDIOCSOSDCOMMAND, &dc);
close(v);
}
else
Interface.Error("can't open VIDEODEVICE");//XXX
}
#endif
void cDvbOsd::Open(int w, int h)
{
cols = w;
rows = h;
#ifdef DEBUG_OSD
//XXX size...
#define B2C(b) (((b) * 1000) / 255)
#define SETCOLOR(n, r, g, b, o) init_color(n, B2C(r), B2C(g), B2C(b))
#else
w *= charWidth;
h *= lineHeight;
int x = (720 - w) / 2; //TODO PAL vs. NTSC???
int y = (576 - h) / 2;
Cmd(OSD_Open, 4, x, y, x + w - 1, y + h - 1);
#define SETCOLOR(n, r, g, b, o) Cmd(OSD_SetColor, n, r, g, b, o)
#endif
SETCOLOR(clrBackground, 0x00, 0x00, 0x00, 127); // background 50% gray
SETCOLOR(clrBlack, 0x00, 0x00, 0x00, 255);
SETCOLOR(clrRed, 0xFC, 0x14, 0x14, 255);
SETCOLOR(clrGreen, 0x24, 0xFC, 0x24, 255);
SETCOLOR(clrYellow, 0xFC, 0xC0, 0x24, 255);
SETCOLOR(clrBlue, 0x00, 0x00, 0xFC, 255);
SETCOLOR(clrCyan, 0x00, 0xFC, 0xFC, 255);
SETCOLOR(clrMagenta, 0xB0, 0x00, 0xFC, 255);
SETCOLOR(clrWhite, 0xFC, 0xFC, 0xFC, 255);
}
void cDvbOsd::Close(void)
{
#ifndef DEBUG_OSD
Cmd(OSD_Close);
#endif
}
void cDvbOsd::Clear(void)
{
#ifdef DEBUG_OSD
SetColor(clrBackground, clrBackground);
Fill(0, 0, cols, rows, clrBackground);
#else
Cmd(OSD_Clear);
#endif
}
void cDvbOsd::Fill(int x, int y, int w, int h, eDvbColor color)
{
if (x < 0) x = cols + x;
if (y < 0) y = rows + y;
#ifdef DEBUG_OSD
SetColor(color, color);
for (int r = 0; r < h; r++) {
wmove(window, y + r, x); // ncurses wants 'y' before 'x'!
whline(window, ' ', w);
}
#else
Cmd(OSD_FillBlock, color, x * charWidth, y * lineHeight, (x + w) * charWidth - 1, (y + h) * lineHeight - 1);
#endif
}
void cDvbOsd::ClrEol(int x, int y, eDvbColor color)
{
Fill(x, y, cols - x, 1, color);
}
void cDvbOsd::Text(int x, int y, const char *s, eDvbColor colorFg, eDvbColor colorBg)
{
if (x < 0) x = cols + x;
if (y < 0) y = rows + y;
#ifdef DEBUG_OSD
SetColor(colorFg, colorBg);
wmove(window, y, x); // ncurses wants 'y' before 'x'!
waddstr(window, s);
#else
Cmd(OSD_Text, (int(colorBg) << 16) | colorFg, x * charWidth, y * lineHeight, 1, 0, s);
#endif
}