mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-21 15:56:42 +00:00
sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy)
Original commit message from CVS: 2008-03-18 Andy Wingo <wingo@pobox.com> * sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) (gst_osx_video_sink_osxwindow_new, cocoa_event_loop): * sys/osxvideo/osxvideosink.h (struct _GstOSXVideoSink): If we need to run an event loop, do so in a task instead of assuming that there will be a GMainLoop. Fixes #523134.
This commit is contained in:
parent
a6019fc0bf
commit
a6267f383e
2 changed files with 19 additions and 11 deletions
|
@ -76,6 +76,8 @@ struct _GstOSXVideoSink {
|
|||
gint fps_n;
|
||||
gint fps_d;
|
||||
|
||||
GstTask *event_task;
|
||||
|
||||
/* Unused */
|
||||
gint pixel_width, pixel_height;
|
||||
|
||||
|
|
|
@ -111,34 +111,33 @@ static GstVideoSinkClass *parent_class = NULL;
|
|||
|
||||
|
||||
/* cocoa event loop - needed if not run in own app */
|
||||
gint
|
||||
static void
|
||||
cocoa_event_loop (GstOSXVideoSink * vsink)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
gboolean ret = TRUE;
|
||||
|
||||
GST_DEBUG_OBJECT (vsink, "Entering event loop");
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
if ([NSApp isRunning]) {
|
||||
while ([NSApp isRunning]) {
|
||||
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||
untilDate:[NSDate distantPast]
|
||||
inMode:NSDefaultRunLoopMode dequeue:YES ];
|
||||
if ( event != nil ) {
|
||||
if ( event == nil ) {
|
||||
g_usleep (100);
|
||||
break;
|
||||
} else {
|
||||
switch ([event type]) {
|
||||
default: //XXX Feed me please
|
||||
[NSApp sendEvent:event];
|
||||
break;
|
||||
break;
|
||||
}
|
||||
/* loop */
|
||||
}
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
GST_DEBUG_OBJECT (vsink, "Leaving event loop with ret : %d", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static NSString *
|
||||
|
@ -281,8 +280,9 @@ gst_osx_video_sink_osxwindow_new (GstOSXVideoSink * osxvideosink, gint width,
|
|||
[NSApp setDelegate:[[GstAppDelegate alloc] init]];
|
||||
|
||||
[NSApp setRunning];
|
||||
// insert event dispatch in the glib main loop
|
||||
g_idle_add ((GSourceFunc) cocoa_event_loop, osxvideosink);
|
||||
osxvideosink->event_task = gst_task_create ((GstTaskFunction)cocoa_event_loop,
|
||||
osxvideosink);
|
||||
gst_task_start (osxvideosink->event_task);
|
||||
} else {
|
||||
GstStructure *s;
|
||||
GstMessage *msg;
|
||||
|
@ -323,6 +323,12 @@ gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink,
|
|||
|
||||
[osxwindow->pool release];
|
||||
|
||||
if (osxvideosink->event_task) {
|
||||
gst_task_join (osxvideosink->event_task);
|
||||
gst_object_unref (osxvideosink->event_task);
|
||||
osxvideosink->event_task = NULL;
|
||||
}
|
||||
|
||||
g_free (osxwindow);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue