/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * dv1394.cc * * Tue Apr 19 12:10:34 CEST 2005 * Copyright 2005 Bent Bisballe * deva@aasimon.org ****************************************************************************/ /* * This file is part of MIaV. * * MIaV is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MIaV 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "dv1394.h" #include #include #include #include #include #include #include #include #include "dv.h" static int write_frame(unsigned char *data, int len, int complete, void *callback_data) { class dv1394 *dv = (class dv1394*)callback_data; if (complete == 0) { fprintf (stderr, "Error: incomplete frame received!\n"); return 0; } //return (fwrite (data, len, 1, f) < 1) ? -1 : 0; unsigned char *ptr = (unsigned char *)malloc(len); memcpy(ptr, data, len); dv->ptr = ptr; return 1; } dv1394::dv1394(Info *i, int p, int c) { //printf("dv1394::dv1394()\n"); info = i; port = p; channel = c; } dv1394::~dv1394() { // printf("dv1394::~dv1394()\n"); iec61883_dv_fb_close (frame); // Close firewire connection. if(handle) raw1394_destroy_handle (handle); } bool dv1394::connect() { //printf("dv1394::connect()\n"); handle = raw1394_new_handle_on_port(port); //printf(" handle: %p\n", handle); frame = iec61883_dv_fb_init(handle, write_frame, this); //printf(" frame: %p\n", frame); if(frame && iec61883_dv_fb_start(frame, channel) == 0) { // ok //printf("frame ok\n"); } else { // fail //printf("frame fail\n"); return false; } return true; } unsigned char *dv1394::readFrame() { struct pollfd pfd; pfd.fd = raw1394_get_fd(handle); pfd.events = POLLIN | POLLPRI; pfd.revents = 0; ptr = NULL; while(ptr == NULL) { if(poll (&pfd, 1, 50) > 0 && (pfd.revents & POLLIN)) { raw1394_loop_iterate(handle); } } return ptr; }