diff options
author | Daniel Mack <zonque@users.sourceforge.net> | 2004-06-25 16:14:20 +0000 |
---|---|---|
committer | Daniel Mack <zonque@users.sourceforge.net> | 2004-06-25 16:14:20 +0000 |
commit | a98eadf09de9e3f7774f54bb98793d10c8c2db58 (patch) | |
tree | 7db6aec4fad5e1c63ce151ddfa36f2506593a521 /src | |
parent | 4ff245bce986904355056ab93a2bd7554bfeae37 (diff) | |
download | xine-lib-a98eadf09de9e3f7774f54bb98793d10c8c2db58.tar.gz xine-lib-a98eadf09de9e3f7774f54bb98793d10c8c2db58.tar.bz2 |
- 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
Diffstat (limited to 'src')
-rw-r--r-- | src/video_out/macosx/video_window.h | 9 | ||||
-rw-r--r-- | src/video_out/macosx/video_window.m | 48 |
2 files changed, 41 insertions, 16 deletions
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 <Cocoa/Cocoa.h> - 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 <Cocoa/Cocoa.h> #include <OpenGL/OpenGL.h> #include <OpenGL/gl.h> #include <OpenGL/glext.h> -#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]; } |