Commit 1be7b761 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Fix line breaks

parent 8fd6167a
/***************************************************************************** /*****************************************************************************
* eyetv.c : Access module to connect to our plugin running within EyeTV * eyetv.c : Access module to connect to our plugin running within EyeTV
***************************************************************************** *****************************************************************************
* Copyright (C) 2006-2007 the VideoLAN team * Copyright (C) 2006-2007 the VideoLAN team
* $Id$ * $Id$
* *
* Author: Felix Kühne <fkuehne at videolan dot org> * Author: Felix Kühne <fkuehne at videolan dot org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/ *****************************************************************************/
/***************************************************************************** /*****************************************************************************
* Preamble * Preamble
*****************************************************************************/ *****************************************************************************/
#include <stdlib.h> #include <stdlib.h>
#include <vlc/vlc.h> #include <vlc/vlc.h>
#include <vlc_access.h> #include <vlc_access.h>
#include <CoreFoundation/CoreFoundation.h> #include <CoreFoundation/CoreFoundation.h>
/* TODO: /* TODO:
* watch for PluginQuit or DeviceRemoved to stop output to VLC's core then */ * watch for PluginQuit or DeviceRemoved to stop output to VLC's core then */
/***************************************************************************** /*****************************************************************************
* Module descriptior * Module descriptior
*****************************************************************************/ *****************************************************************************/
static int Open ( vlc_object_t * ); static int Open ( vlc_object_t * );
static void Close( vlc_object_t * ); static void Close( vlc_object_t * );
vlc_module_begin(); vlc_module_begin();
set_shortname( "EyeTV" ); set_shortname( "EyeTV" );
set_description( _("EyeTV access module") ); set_description( _("EyeTV access module") );
set_category( CAT_INPUT ); set_category( CAT_INPUT );
set_subcategory( SUBCAT_INPUT_ACCESS ); set_subcategory( SUBCAT_INPUT_ACCESS );
set_capability( "access2", 0 ); set_capability( "access2", 0 );
add_shortcut( "eyetv" ); add_shortcut( "eyetv" );
set_callbacks( Open, Close ); set_callbacks( Open, Close );
vlc_module_end(); vlc_module_end();
/***************************************************************************** /*****************************************************************************
* Access: local prototypes * Access: local prototypes
*****************************************************************************/ *****************************************************************************/
typedef struct typedef struct
{ {
VLC_COMMON_MEMBERS VLC_COMMON_MEMBERS
vlc_mutex_t lock; vlc_mutex_t lock;
vlc_cond_t wait; vlc_cond_t wait;
CFMessagePortRef inputMessagePortFromEyeTV; CFMessagePortRef inputMessagePortFromEyeTV;
} eyetv_thread_t; } eyetv_thread_t;
struct access_sys_t struct access_sys_t
{ {
eyetv_thread_t *p_thread; eyetv_thread_t *p_thread;
}; };
CFDataRef dataFromEyetv; CFDataRef dataFromEyetv;
int lastPacketId; int lastPacketId;
int lastForwardedPacketId; int lastForwardedPacketId;
static int Read( access_t *, uint8_t *, int ); static int Read( access_t *, uint8_t *, int );
static int Control( access_t *, int, va_list ); static int Control( access_t *, int, va_list );
static void Thread( vlc_object_t * ); static void Thread( vlc_object_t * );
CFDataRef msgPortCallback( CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info ); CFDataRef msgPortCallback( CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info );
/***************************************************************************** /*****************************************************************************
* Open: sets up the module and its threads * Open: sets up the module and its threads
*****************************************************************************/ *****************************************************************************/
static int Open( vlc_object_t *p_this ) static int Open( vlc_object_t *p_this )
{ {
access_t *p_access = (access_t *)p_this; access_t *p_access = (access_t *)p_this;
access_sys_t *p_sys; access_sys_t *p_sys;
eyetv_thread_t *p_thread; eyetv_thread_t *p_thread;
CFMessagePortContext context; CFMessagePortContext context;
memset(&context, 0, sizeof(context)); memset(&context, 0, sizeof(context));
/* Init p_access */ /* Init p_access */
access_InitFields( p_access ); \ access_InitFields( p_access ); \
ACCESS_SET_CALLBACKS( Read, NULL, Control, NULL ); \ ACCESS_SET_CALLBACKS( Read, NULL, Control, NULL ); \
MALLOC_ERR( p_access->p_sys, access_sys_t ); \ MALLOC_ERR( p_access->p_sys, access_sys_t ); \
p_sys = p_access->p_sys; memset( p_sys, 0, sizeof( access_sys_t ) ); p_sys = p_access->p_sys; memset( p_sys, 0, sizeof( access_sys_t ) );
msg_Dbg( p_access, "coming up" ); msg_Dbg( p_access, "coming up" );
/* create receiving thread which will keep the message port alive without blocking */ /* create receiving thread which will keep the message port alive without blocking */
p_sys->p_thread = p_thread = vlc_object_create( p_access, sizeof( eyetv_thread_t ) ); p_sys->p_thread = p_thread = vlc_object_create( p_access, sizeof( eyetv_thread_t ) );
vlc_object_attach( p_thread, p_this ); vlc_object_attach( p_thread, p_this );
vlc_mutex_init( p_access, &p_thread->lock ); vlc_mutex_init( p_access, &p_thread->lock );
vlc_cond_init( p_access, &p_thread->wait ); vlc_cond_init( p_access, &p_thread->wait );
msg_Dbg( p_access, "thread created, msg port following now" ); msg_Dbg( p_access, "thread created, msg port following now" );
/* set up our own msg port /* set up our own msg port
* we may give the msgport such a generic name, because EyeTV may only run * we may give the msgport such a generic name, because EyeTV may only run
* once per entire machine, so we can't interfere with other instances. * once per entire machine, so we can't interfere with other instances.
* we just trust the user no to launch multiple VLC instances trying to * we just trust the user no to launch multiple VLC instances trying to
* access EyeTV at the same time. If this happens, the latest launched * access EyeTV at the same time. If this happens, the latest launched
* instance will win. */ * instance will win. */
p_sys->p_thread->inputMessagePortFromEyeTV = CFMessagePortCreateLocal( kCFAllocatorDefault, p_sys->p_thread->inputMessagePortFromEyeTV = CFMessagePortCreateLocal( kCFAllocatorDefault,
CFSTR("VLCEyeTVMsgPort"), CFSTR("VLCEyeTVMsgPort"),
&msgPortCallback, &msgPortCallback,
&context, &context,
/* no info to free */ NULL ); /* no info to free */ NULL );
if( p_sys->p_thread->inputMessagePortFromEyeTV == NULL ) if( p_sys->p_thread->inputMessagePortFromEyeTV == NULL )
{ {
msg_Err( p_access, "opening local msg port failed" ); msg_Err( p_access, "opening local msg port failed" );
free( p_sys->p_thread->inputMessagePortFromEyeTV ); free( p_sys->p_thread->inputMessagePortFromEyeTV );
vlc_mutex_destroy( &p_thread->lock ); vlc_mutex_destroy( &p_thread->lock );
vlc_cond_destroy( &p_thread->wait ); vlc_cond_destroy( &p_thread->wait );
vlc_object_detach( p_thread ); vlc_object_detach( p_thread );
vlc_object_destroy( p_thread ); vlc_object_destroy( p_thread );
free( p_sys ); free( p_sys );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
else else
msg_Dbg( p_access, "remote msg port opened" ); msg_Dbg( p_access, "remote msg port opened" );
/* let the thread run */ /* let the thread run */
if( vlc_thread_create( p_thread, "EyeTV Receiver Thread", Thread, if( vlc_thread_create( p_thread, "EyeTV Receiver Thread", Thread,
VLC_THREAD_PRIORITY_HIGHEST, VLC_FALSE ) ) VLC_THREAD_PRIORITY_HIGHEST, VLC_FALSE ) )
{ {
msg_Err( p_access, "couldn't launch eyetv receiver thread" ); msg_Err( p_access, "couldn't launch eyetv receiver thread" );
vlc_mutex_destroy( &p_thread->lock ); vlc_mutex_destroy( &p_thread->lock );
vlc_cond_destroy( &p_thread->wait ); vlc_cond_destroy( &p_thread->wait );
vlc_object_detach( p_thread ); vlc_object_detach( p_thread );
vlc_object_destroy( p_thread ); vlc_object_destroy( p_thread );
free( p_sys ); free( p_sys );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
msg_Dbg( p_access, "receiver thread created and launched" ); msg_Dbg( p_access, "receiver thread created and launched" );
/* tell the EyeTV plugin to open up its msg port and start sending */ /* tell the EyeTV plugin to open up its msg port and start sending */
CFNotificationCenterPostNotification( CFNotificationCenterGetDistributedCenter (), CFNotificationCenterPostNotification( CFNotificationCenterGetDistributedCenter (),
CFSTR("VLCAccessStartDataSending"), CFSTR("VLCAccessStartDataSending"),
CFSTR("VLCEyeTVSupport"), CFSTR("VLCEyeTVSupport"),
/*userInfo*/ NULL, /*userInfo*/ NULL,
TRUE ); TRUE );
msg_Dbg( p_access, "plugin notified" ); msg_Dbg( p_access, "plugin notified" );
/* we don't need such a high priority */ /* we don't need such a high priority */
//vlc_thread_set_priority( p_access, VLC_THREAD_PRIORITY_LOW ); //vlc_thread_set_priority( p_access, VLC_THREAD_PRIORITY_LOW );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
/***************************************************************************** /*****************************************************************************
* Close: closes msg-port, free resources * Close: closes msg-port, free resources
*****************************************************************************/ *****************************************************************************/
static void Close( vlc_object_t *p_this ) static void Close( vlc_object_t *p_this )
{ {
access_t *p_access = (access_t *)p_this; access_t *p_access = (access_t *)p_this;
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
msg_Dbg( p_access, "closing" ); msg_Dbg( p_access, "closing" );
/* tell the EyeTV plugin to close its msg port and stop sending */ /* tell the EyeTV plugin to close its msg port and stop sending */
CFNotificationCenterPostNotification( CFNotificationCenterGetDistributedCenter (), CFNotificationCenterPostNotification( CFNotificationCenterGetDistributedCenter (),
CFSTR("VLCAccessStopDataSending"), CFSTR("VLCAccessStopDataSending"),
CFSTR("VLCEyeTVSupport"), CFSTR("VLCEyeTVSupport"),
/*userInfo*/ NULL, /*userInfo*/ NULL,
TRUE ); TRUE );
msg_Dbg( p_access, "plugin notified" ); msg_Dbg( p_access, "plugin notified" );
/* stop receiver thread */ /* stop receiver thread */
p_sys->p_thread->b_die = VLC_TRUE; p_sys->p_thread->b_die = VLC_TRUE;
vlc_mutex_lock( &p_sys->p_thread->lock ); vlc_mutex_lock( &p_sys->p_thread->lock );
vlc_cond_signal( &p_sys->p_thread->wait ); vlc_cond_signal( &p_sys->p_thread->wait );
vlc_mutex_unlock( &p_sys->p_thread->lock ); vlc_mutex_unlock( &p_sys->p_thread->lock );
vlc_thread_join( p_sys->p_thread ); vlc_thread_join( p_sys->p_thread );
/* close msg port */ /* close msg port */
CFMessagePortInvalidate( p_sys->p_thread->inputMessagePortFromEyeTV ); CFMessagePortInvalidate( p_sys->p_thread->inputMessagePortFromEyeTV );
free( p_sys->p_thread->inputMessagePortFromEyeTV ); free( p_sys->p_thread->inputMessagePortFromEyeTV );
msg_Dbg( p_access, "msg port closed and freed" ); msg_Dbg( p_access, "msg port closed and freed" );
/* free thread */ /* free thread */
vlc_mutex_destroy( &p_sys->p_thread->lock ); vlc_mutex_destroy( &p_sys->p_thread->lock );
vlc_cond_destroy( &p_sys->p_thread->wait ); vlc_cond_destroy( &p_sys->p_thread->wait );
vlc_object_detach( p_sys->p_thread ); vlc_object_detach( p_sys->p_thread );
vlc_object_destroy( p_sys->p_thread ); vlc_object_destroy( p_sys->p_thread );
free( p_sys ); free( p_sys );
} }
static void Thread( vlc_object_t *p_this ) static void Thread( vlc_object_t *p_this )
{ {
eyetv_thread_t *p_thread= (eyetv_thread_t*)p_this; eyetv_thread_t *p_thread= (eyetv_thread_t*)p_this;
CFRunLoopSourceRef runLoopSource; CFRunLoopSourceRef runLoopSource;
/* create our run loop source for the port and attach it to our current loop */ /* create our run loop source for the port and attach it to our current loop */
runLoopSource = CFMessagePortCreateRunLoopSource( kCFAllocatorDefault, runLoopSource = CFMessagePortCreateRunLoopSource( kCFAllocatorDefault,
p_thread->inputMessagePortFromEyeTV, p_thread->inputMessagePortFromEyeTV,
0 ); 0 );
CFRunLoopAddSource( CFRunLoopGetCurrent(), CFRunLoopAddSource( CFRunLoopGetCurrent(),
runLoopSource, runLoopSource,
kCFRunLoopDefaultMode ); kCFRunLoopDefaultMode );
CFRunLoopRun(); CFRunLoopRun();
} }
/***************************************************************************** /*****************************************************************************
* msgPortCallback: receives data from the EyeTV plugin * msgPortCallback: receives data from the EyeTV plugin
*****************************************************************************/ *****************************************************************************/
CFDataRef msgPortCallback( CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info ) CFDataRef msgPortCallback( CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info )
{ {
extern CFDataRef dataFromEyetv; extern CFDataRef dataFromEyetv;
extern int lastPacketId; extern int lastPacketId;
/* copy callback data to module data */ /* copy callback data to module data */
dataFromEyetv = CFDataCreateCopy( kCFAllocatorDefault, data ); dataFromEyetv = CFDataCreateCopy( kCFAllocatorDefault, data );
#if 0 #if 0
printf( "packet %i contained %i bytes, forwarding %i bytes\n", printf( "packet %i contained %i bytes, forwarding %i bytes\n",
(int)msgid, (int)msgid,
(int)CFDataGetLength( data ), (int)CFDataGetLength( data ),
(int)CFDataGetLength( dataFromEyetv ) ); (int)CFDataGetLength( dataFromEyetv ) );
#endif #endif
lastPacketId = msgid; lastPacketId = msgid;
return NULL; /* we've got nothing to return */ return NULL; /* we've got nothing to return */
} }
/***************************************************************************** /*****************************************************************************
* Read: forwarding data from EyeTV plugin which was received above * Read: forwarding data from EyeTV plugin which was received above
*****************************************************************************/ *****************************************************************************/
static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
{ {
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
extern CFDataRef dataFromEyetv; extern CFDataRef dataFromEyetv;
extern int lastPacketId; extern int lastPacketId;
extern int lastForwardedPacketId; extern int lastForwardedPacketId;
/* wait for a new buffer before forwarding */ /* wait for a new buffer before forwarding */
while( lastPacketId == lastForwardedPacketId && !p_access->b_die ) while( lastPacketId == lastForwardedPacketId && !p_access->b_die )
{ {
msleep( INPUT_ERROR_SLEEP ); msleep( INPUT_ERROR_SLEEP );
} }
/* read data here, copy it to p_buffer, fill i_len with respective length /* read data here, copy it to p_buffer, fill i_len with respective length
* and return info with i_read; i_read = 0 == EOF */ * and return info with i_read; i_read = 0 == EOF */
if( dataFromEyetv ) if( dataFromEyetv )
{ {
CFDataGetBytes( dataFromEyetv, CFDataGetBytes( dataFromEyetv,
CFRangeMake( 0, CFDataGetLength( dataFromEyetv ) ), CFRangeMake( 0, CFDataGetLength( dataFromEyetv ) ),
(uint8_t *)p_buffer ); (uint8_t *)p_buffer );
i_len = (int)CFDataGetLength( dataFromEyetv ); i_len = (int)CFDataGetLength( dataFromEyetv );
#if 0 #if 0
msg_Dbg( p_access, "%i bytes with id %i received in read function, pushing to core", msg_Dbg( p_access, "%i bytes with id %i received in read function, pushing to core",
(int)CFDataGetLength( dataFromEyetv ), lastPacketId ); (int)CFDataGetLength( dataFromEyetv ), lastPacketId );
#endif #endif
lastForwardedPacketId = lastPacketId; lastForwardedPacketId = lastPacketId;
if( i_len == 0) if( i_len == 0)
{ {
msg_Err( p_access, "you looosed!" ); msg_Err( p_access, "you looosed!" );
return 0; return 0;
} }
} }
if( p_access->b_die ) if( p_access->b_die )
return 0; return 0;
return i_len; return i_len;
} }
/***************************************************************************** /*****************************************************************************
* Control: * Control:
*****************************************************************************/ *****************************************************************************/
static int Control( access_t *p_access, int i_query, va_list args ) static int Control( access_t *p_access, int i_query, va_list args )
{/* {/*
vlc_bool_t *pb_bool; vlc_bool_t *pb_bool;
int *pi_int; int *pi_int;
int64_t *pi_64; int64_t *pi_64;
switch( i_query ) switch( i_query )
{ {
* * * *
case ACCESS_SET_PAUSE_STATE: case ACCESS_SET_PAUSE_STATE:
* Nothing to do * * Nothing to do *
break; break;
case ACCESS_CAN_SEEK: case ACCESS_CAN_SEEK:
case ACCESS_CAN_FASTSEEK: case ACCESS_CAN_FASTSEEK:
case ACCESS_CAN_PAUSE: case ACCESS_CAN_PAUSE:
case ACCESS_CAN_CONTROL_PACE: case ACCESS_CAN_CONTROL_PACE:
case ACCESS_GET_MTU: case ACCESS_GET_MTU:
case ACCESS_GET_PTS_DELAY: case ACCESS_GET_PTS_DELAY:
case ACCESS_GET_TITLE_INFO: case ACCESS_GET_TITLE_INFO:
case ACCESS_SET_TITLE: case ACCESS_SET_TITLE:
case ACCESS_SET_SEEKPOINT: case ACCESS_SET_SEEKPOINT:
case ACCESS_SET_PRIVATE_ID_STATE: case ACCESS_SET_PRIVATE_ID_STATE:
return VLC_EGENERIC; return VLC_EGENERIC;
default: default:
msg_Warn( p_access, "unimplemented query in control" ); msg_Warn( p_access, "unimplemented query in control" );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
return VLC_SUCCESS;*/ return VLC_SUCCESS;*/
return VLC_EGENERIC; return VLC_EGENERIC;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment