/*****************************************************************************
* voutgl.m: MacOS X OpenGL provider
*****************************************************************************
- * Copyright (C) 2001-2003 VideoLAN
+ * Copyright (C) 2001-2004 the VideoLAN team
* $Id: vout.m 8351 2004-08-02 13:06:38Z hartman $
*
* Authors: Colin Delacroix <colin@zoy.org>
vout_thread_t * p_vout;
}
-- (id)initWithFrame: (NSRect) frame vout: (vout_thread_t*) p_vout;
-
+- (id) initWithVout: (vout_thread_t *) p_vout;
@end
-
struct vout_sys_t
{
NSAutoreleasePool * o_pool;
vlc_bool_t b_saved_frame;
NSRect s_frame;
vlc_bool_t b_got_frame;
+ vlc_mutex_t lock;
};
/*****************************************************************************
static int Manage ( vout_thread_t * p_vout );
static int Control( vout_thread_t *, int, va_list );
static void Swap ( vout_thread_t * p_vout );
+static int Lock ( vout_thread_t * p_vout );
+static void Unlock ( vout_thread_t * p_vout );
int E_(OpenVideoGL) ( vlc_object_t * p_this )
{
memset( p_vout->p_sys, 0, sizeof( vout_sys_t ) );
p_vout->p_sys->o_pool = [[NSAutoreleasePool alloc] init];
+ vlc_mutex_init( p_vout, &p_vout->p_sys->lock );
+
+ /* Create the GL view */
+ p_vout->p_sys->o_glview = [[VLCGLView alloc] initWithVout: p_vout];
+ [p_vout->p_sys->o_glview autorelease];
- /* Spawn window */
+ /* Spawn the window */
p_vout->p_sys->b_got_frame = VLC_FALSE;
p_vout->p_sys->o_window = [[VLCWindow alloc] initWithVout: p_vout
- frame: nil];
+ view: p_vout->p_sys->o_glview frame: nil];
if( !p_vout->p_sys->o_window )
{
return VLC_EGENERIC;
}
- /* Add OpenGL view */
-#define o_glview p_vout->p_sys->o_glview
- o_glview = [[VLCGLView alloc] initWithFrame:
- [p_vout->p_sys->o_window frame] vout: p_vout];
- [p_vout->p_sys->o_window setContentView: o_glview];
- [o_glview autorelease];
-#undef o_glview
-
p_vout->pf_init = Init;
p_vout->pf_end = End;
p_vout->pf_manage = Manage;
p_vout->pf_control= Control;
p_vout->pf_swap = Swap;
+ p_vout->pf_lock = Lock;
+ p_vout->pf_unlock = Unlock;
return VLC_SUCCESS;
}
vout_thread_t * p_vout = (vout_thread_t *) p_this;
NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
- /* Remove the GLView from the window, because we are not sure OS X
- will actually close the window right away. When it doesn't,
- VLCGLView's reshape is called while p_vout and p_vout->p_sys
- aren't valid anymore and crashes. */
- [p_vout->p_sys->o_window setContentView: NULL];
-
/* Close the window */
[p_vout->p_sys->o_window close];
/* Clean up */
+ vlc_mutex_destroy( &p_vout->p_sys->lock );
[o_pool release];
free( p_vout->p_sys );
}
p_vout->b_fullscreen = !p_vout->b_fullscreen;
+#define o_glview p_vout->p_sys->o_glview
+ o_glview = [[VLCGLView alloc] initWithVout: p_vout];
+ [o_glview autorelease];
+
if( p_vout->p_sys->b_saved_frame )
{
p_vout->p_sys->o_window = [[VLCWindow alloc]
- initWithVout: p_vout frame: &p_vout->p_sys->s_frame];
+ initWithVout: p_vout view: o_glview
+ frame: &p_vout->p_sys->s_frame];
}
else
{
p_vout->p_sys->o_window = [[VLCWindow alloc]
- initWithVout: p_vout frame: nil];
+ initWithVout: p_vout view: o_glview frame: nil];
}
-#define o_glview p_vout->p_sys->o_glview
- o_glview = [[VLCGLView alloc] initWithFrame: [p_vout->p_sys->o_window frame] vout: p_vout];
- [p_vout->p_sys->o_window setContentView: o_glview];
- [o_glview autorelease];
[[o_glview openGLContext] makeCurrentContext];
#undef o_glview
+
[o_pool release];
p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
{
p_vout->p_sys->b_got_frame = VLC_TRUE;
[[p_vout->p_sys->o_glview openGLContext] makeCurrentContext];
- if( [p_vout->p_sys->o_glview lockFocusIfCanDraw] )
- {
- glFlush();
- [p_vout->p_sys->o_glview unlockFocus];
- }
+ glFlush();
+}
+
+static int Lock( vout_thread_t * p_vout )
+{
+ vlc_mutex_lock( &p_vout->p_sys->lock );
+ return 0;
+}
+
+static void Unlock( vout_thread_t * p_vout )
+{
+ vlc_mutex_unlock( &p_vout->p_sys->lock );
}
/*****************************************************************************
*****************************************************************************/
@implementation VLCGLView
-- (id) initWithFrame: (NSRect) frame vout: (vout_thread_t*) _p_vout
+- (id) initWithVout: (vout_thread_t *) vout
{
- p_vout = _p_vout;
+ p_vout = vout;
NSOpenGLPixelFormatAttribute attribs[] =
{
return nil;
}
- self = [super initWithFrame:frame pixelFormat: fmt];
+ self = [super initWithFrame: NSMakeRect(0,0,10,10) pixelFormat: fmt];
[fmt release];
[[self openGLContext] makeCurrentContext];
- (void) reshape
{
int x, y;
+ vlc_value_t val;
+
+ Lock( p_vout );
NSRect bounds = [self bounds];
+
[[self openGLContext] makeCurrentContext];
- if( bounds.size.height * p_vout->render.i_aspect <
- bounds.size.width * VOUT_ASPECT_FACTOR )
+
+ var_Get( p_vout, "macosx-stretch", &val );
+ if( val.b_bool )
+ {
+ x = bounds.size.width;
+ y = bounds.size.height;
+ }
+ else if( bounds.size.height * p_vout->render.i_aspect <
+ bounds.size.width * VOUT_ASPECT_FACTOR )
{
x = bounds.size.height * p_vout->render.i_aspect / VOUT_ASPECT_FACTOR;
y = bounds.size.height;
x = bounds.size.width;
y = bounds.size.width * VOUT_ASPECT_FACTOR / p_vout->render.i_aspect;
}
+
glViewport( ( bounds.size.width - x ) / 2,
( bounds.size.height - y ) / 2, x, y );
/* Ask the opengl module to redraw */
vout_thread_t * p_parent;
p_parent = (vout_thread_t *) p_vout->p_parent;
+ Unlock( p_vout );
if( p_parent && p_parent->pf_display )
{
p_parent->pf_display( p_parent, NULL );
else
{
glClear( GL_COLOR_BUFFER_BIT );
+ Unlock( p_vout );
}
+ [super reshape];
+}
+
+- (void) update
+{
+ Lock( p_vout );
+ [super update];
+ Unlock( p_vout );
}
- (void) drawRect: (NSRect) rect
{
+ Lock( p_vout );
[[self openGLContext] makeCurrentContext];
glFlush();
+ [super drawRect:rect];
+ Unlock( p_vout );
}
@end