1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00
vdr/dvbapi.c
Klaus Schmidinger 4a9d9c5876 Initial revision
2000-02-19 13:36:48 +01:00

167 lines
3.5 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.1 2000/02/19 13:36:48 kls Exp $
*/
// FIXME: these should be defined in ../DVB/driver/dvb.h!!!
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
#include "dvbapi.h"
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "../DVB/driver/dvb.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)
{
}
cDvbRecorder::~cDvbRecorder()
{
Stop();
}
bool cDvbRecorder::Record(const char *FileName, char Quality)
{
isyslog(LOG_INFO, "record %s (%c)", FileName, Quality);
return true;
// TODO
return false;
}
bool cDvbRecorder::Play(const char *FileName, int Frame)
{
isyslog(LOG_INFO, "play %s (%d)", FileName, Frame);
// TODO
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");
// TODO
}
int cDvbRecorder::Frame(void)
{
isyslog(LOG_INFO, "frame");
// TODO
return 0;
}
// ---------------------------------------------------------------------------
static void DvbOsdCmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, void *data = NULL)
{
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 = data;
ioctl(v, VIDIOCSOSDCOMMAND, &dc);
close(v);
}
else
Interface.Error("can't open VIDEODEVICE");//XXX
}
void DvbOsdOpen(int x, int y, int w, int h)
{
DvbOsdCmd(OSD_Open, 1, x, y, x + w - 1, y + h - 1);
DvbOsdCmd(OSD_SetColor, 0, 0, 0, 0, 127); // background 50% gray
DvbOsdCmd(OSD_SetColor, 1, 255, 255, 255, 255); // text white
}
void DvbOsdClose(void)
{
DvbOsdCmd(OSD_Close);
}
void DvbOsdClear(void)
{
DvbOsdCmd(OSD_Clear);
}
void DvbOsdClrEol(int x, int y)
{
DvbOsdCmd(OSD_FillBlock, 0, x, y * DvbOsdLineHeight, x + 490, (y + 1) * DvbOsdLineHeight);//XXX
}
void DvbOsdText(int x, int y, char *s)
{
DvbOsdCmd(OSD_Text, 1, x, y, 1, 0, s);
}