blob: d0fa118787cdcf81bc8cb3fe93b4c2bf30b8fc9f [file] [log] [blame]
/*
* libiec61883 - Linux IEEE 1394 streaming media library.
* Copyright (C) 2004 Dan Dennedy
*
* This example demonstrates creating a process to host plug control registers
* used for connection management procedures as described in IEC 61883-1.
* This can be expanded to run as a daemon, use syslog, and define some
* interprocess communication for the addition and removal of plug control
* registers. libiec61883 plug functions are not thread safe and manipulations
* should be protected.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../src/iec61883.h"
#include <stdio.h>
#include <sys/select.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
static int g_done = 0;
static void sighandler (int sig)
{
g_done = 1;
}
int main (int argc, char *argv[])
{
raw1394handle_t handle = raw1394_new_handle_on_port (0);
if (handle) {
int fd = raw1394_get_fd (handle);
struct timeval tv;
fd_set rfds;
int result;
signal (SIGINT, sighandler);
signal (SIGTERM, sighandler);
if ((result = iec61883_plug_impr_init (handle, IEC61883_DATARATE_400)) < 0) {
fprintf (stderr, "iec61883_plug_impr_init failed: %d\n", result);
raw1394_destroy_handle (handle);
return 1;
}
if ((result = iec61883_plug_ipcr_add (handle, 1 /* online */)) < 0) {
fprintf (stderr, "iec61883_plug_add_ipcr failed: %d\n", result);
raw1394_destroy_handle (handle);
return 1;
}
if ((result = iec61883_plug_ompr_init (handle, IEC61883_DATARATE_400, 63)) < 0) {
fprintf (stderr, "iec61883_plug_ompr_init failed: %d\n", result);
raw1394_destroy_handle (handle);
return 1;
}
/* 968 = 5 transport stream packets + CIP header, payload is in quadlets */
/* even after reading the spec I still don't understand the overhead
parameter. Besides, the iso packet headers, where does the overhead
come from? */
if ((result = iec61883_plug_opcr_add (handle, 1 /* online */,
IEC61883_OVERHEAD_512, 968/4)) < 0) {
fprintf (stderr, "iec61883_plug_add_opcr failed: %d\n", result);
raw1394_destroy_handle (handle);
return 1;
}
do {
FD_ZERO (&rfds);
FD_SET (fd, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 20000;
if (select (fd + 1, &rfds, NULL, NULL, &tv) > 0)
raw1394_loop_iterate (handle);
} while (g_done == 0);
fprintf (stderr, "done.\n");
iec61883_plug_impr_close (handle);
iec61883_plug_ompr_close (handle);
raw1394_destroy_handle (handle);
} else {
fprintf (stderr, "Failed to get libraw1394 handle\n");
return 1;
}
return 0;
}