summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Mack <zonque@users.sourceforge.net>2004-06-25 16:14:20 +0000
committerDaniel Mack <zonque@users.sourceforge.net>2004-06-25 16:14:20 +0000
commita98eadf09de9e3f7774f54bb98793d10c8c2db58 (patch)
tree7db6aec4fad5e1c63ce151ddfa36f2506593a521 /src
parent4ff245bce986904355056ab93a2bd7554bfeae37 (diff)
downloadxine-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.h9
-rw-r--r--src/video_out/macosx/video_window.m48
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];
}