From a98eadf09de9e3f7774f54bb98793d10c8c2db58 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Fri, 25 Jun 2004 16:14:20 +0000 Subject: - trying to fix the kernel panics by wrapping some functions with a mutex. maybe that helps. - some indentation fixes CVS patchset: 6745 CVS date: 2004/06/25 16:14:20 --- src/video_out/macosx/video_window.h | 9 ++++--- src/video_out/macosx/video_window.m | 48 ++++++++++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/video_out/macosx/video_window.h b/src/video_out/macosx/video_window.h index 44b157f00..b6b79a75d 100644 --- a/src/video_out/macosx/video_window.h +++ b/src/video_out/macosx/video_window.h @@ -22,8 +22,6 @@ #ifndef HAVE_VIDEO_WINDOW_H #define HAVE_VIDEO_WINDOW_H -#import - typedef enum { XINE_FULLSCREEN_OVERSCAN, XINE_FULLSCREEN_CROP @@ -33,13 +31,14 @@ typedef enum { @interface XineOpenGLView : NSOpenGLView { IBOutlet id delegate; int video_width, video_height; - char * texture_buffer; + char *texture_buffer; unsigned long i_texture; BOOL initDone; BOOL isFullScreen; XineVideoWindowFullScreenMode fullscreen_mode; - NSOpenGLContext * fullScreenContext; - NSOpenGLContext * currentContext; + NSOpenGLContext *fullScreenContext; + NSOpenGLContext *currentContext; + NSLock *mutex; } - (void) displayTexture; diff --git a/src/video_out/macosx/video_window.m b/src/video_out/macosx/video_window.m index 4aebf8218..171bd2ceb 100644 --- a/src/video_out/macosx/video_window.m +++ b/src/video_out/macosx/video_window.m @@ -23,11 +23,12 @@ * Thanks for the good research! */ +#include #include #include #include -#import "video_window.h" +#include "video_window.h" NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; @@ -173,9 +174,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; - (void) displayTexture { if ([self lockFocusIfCanDraw]) { - [self drawRect: [self bounds]]; - [self reloadTexture]; - [self unlockFocus]; + [self drawRect: [self bounds]]; + [self reloadTexture]; + [self unlockFocus]; } } @@ -215,6 +216,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; video_width = frame.size.width; video_height = frame.size.height; texture_buffer = nil; + mutex = [[NSLock alloc] init]; [self initTextures]; @@ -254,6 +256,8 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; currentContext = nil; } + [mutex dealloc]; + // Enabling the [super dealloc] below (which should be correct behaviour) // crashes -- not sure why ... // @@ -263,13 +267,19 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; } - (void) reshape { - if (!initDone) + [mutex lock]; + + if (!initDone) { + [mutex unlock]; return; + } [currentContext makeCurrentContext]; NSRect bounds = [self bounds]; glViewport (0, 0, bounds.size.width, bounds.size.height); + + [mutex unlock]; } - (void) setNormalSize { @@ -310,6 +320,8 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; - (void) initTextures { + [mutex lock]; + [currentContext makeCurrentContext]; /* Free previous texture if any */ @@ -355,18 +367,23 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glTexImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, video_width, video_height, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, texture_buffer); initDone = YES; + [mutex unlock]; } - (void) reloadTexture { - if (!initDone) + [mutex lock]; + + if (!initDone) { + [mutex unlock]; return; + } [currentContext makeCurrentContext]; @@ -380,6 +397,8 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; video_width, video_height, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, texture_buffer); + + [mutex unlock]; } - (void) calcFullScreenAspect { @@ -425,7 +444,8 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; } - (void) goFullScreen: (XineVideoWindowFullScreenMode) mode { - + [mutex lock]; + /* Create the new pixel format */ NSOpenGLPixelFormatAttribute attribs[] = { NSOpenGLPFAAccelerated, @@ -463,6 +483,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; } [fullScreenContext setFullScreen]; [fullScreenContext makeCurrentContext]; + [mutex unlock]; fullscreen_mode = mode; @@ -477,6 +498,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; - (void) exitFullScreen { initDone = NO; + currentContext = [self openGLContext]; /* Free current OpenGL context */ @@ -518,7 +540,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; - (void) drawRect: (NSRect) rect { [currentContext makeCurrentContext]; - if (!initDone) { + if (!initDone || ![mutex tryLock]) { [currentContext flushBuffer]; return; } @@ -538,6 +560,8 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; /* Wait for the job to be done */ [currentContext flushBuffer]; + + [mutex unlock]; } - (char *) getTextureBuffer { @@ -560,10 +584,12 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; NSValue *sizeWrapper = [NSValue valueWithBytes:&size objCType:@encode(NSSize)]; - + + [mutex lock]; [self performSelectorOnMainThread:@selector(setViewSize:) withObject:sizeWrapper - waitUntilDone:NO]; + waitUntilDone:NO]; + [mutex unlock]; [pool release]; } -- cgit v1.2.3