annotate mp_fifo.c @ 30811:50e0f6942e43

Implement Win32 mutexes. Implement Win32 mutexes; they used to just be mapped on top of events, which is not the same thing at all. The implementation is pretty much the obvious one, similar to the current critical section implementation and the semaphore implementation; a single lock count protected by a pthread mutex, and an event lockers can sleep on to know when the mutex is available. Also make CreateMutexA and ReleaseMutex available even if QuickTime codecs support is not configured.
author sesse
date Sat, 06 Mar 2010 10:13:37 +0000
parents 321e9ea69b9f
children 55a5a5e334dc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30429
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
1 /*
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
2 * This file is part of MPlayer.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
3 *
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
5 * it under the terms of the GNU General Public License as published by
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
7 * (at your option) any later version.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
8 *
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
12 * GNU General Public License for more details.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
13 *
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
14 * You should have received a copy of the GNU General Public License along
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
17 */
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 22823
diff changeset
18
22823
98eaf29b5dee Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents: 22313
diff changeset
19 #include <stdlib.h>
98eaf29b5dee Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents: 22313
diff changeset
20 #include "osdep/timer.h"
98eaf29b5dee Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents: 22313
diff changeset
21 #include "input/input.h"
21941
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
22 #include "input/mouse.h"
30554
321e9ea69b9f #include corresponding .h files in .c files.
diego
parents: 30429
diff changeset
23 #include "mp_fifo.h"
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
24
22131
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
25 int key_fifo_size = 7;
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
26 static int *key_fifo_data = NULL;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
27 static int key_fifo_read=0;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
28 static int key_fifo_write=0;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
29
21941
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
30 static void mplayer_put_key_internal(int code){
22131
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
31 int fifo_free = key_fifo_read - key_fifo_write - 1;
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
32 if (fifo_free < 0) fifo_free += key_fifo_size;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
33 // printf("mplayer_put_key(%d)\n",code);
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
34 if (key_fifo_data == NULL)
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
35 key_fifo_data = malloc(key_fifo_size * sizeof(int));
22131
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
36 if(!fifo_free) return; // FIFO FULL!!
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
37 // reserve some space for key release events to avoid stuck keys
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
38 if((code & MP_KEY_DOWN) && fifo_free < (key_fifo_size >> 1))
934010b90043 Reserve half of fifo for key release events to help avoiding stop buttons
reimar
parents: 21964
diff changeset
39 return;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
40 key_fifo_data[key_fifo_write]=code;
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
41 key_fifo_write=(key_fifo_write+1)%key_fifo_size;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
42 }
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
43
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
44 int mplayer_get_key(int fd){
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
45 int key;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
46 // printf("mplayer_get_key(%d)\n",fd);
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
47 if (key_fifo_data == NULL)
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
48 return MP_INPUT_NOTHING;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
49 if(key_fifo_write==key_fifo_read) return MP_INPUT_NOTHING;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
50 key=key_fifo_data[key_fifo_read];
14077
3d3f3cc8494a use a configurable-size ringbuffer instead of a pipe for buffering key events.
reimar
parents: 13872
diff changeset
51 key_fifo_read=(key_fifo_read+1)%key_fifo_size;
9831
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
52 // printf("mplayer_get_key => %d\n",key);
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
53 return key;
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
54 }
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
55
0397b461f0fb MINGW32 port and select()less fifocode by Arpi
faust3
parents: 7483
diff changeset
56
22823
98eaf29b5dee Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents: 22313
diff changeset
57 unsigned doubleclick_time = 300;
21941
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
58
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
59 static void put_double(int code) {
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
60 if (code >= MOUSE_BTN0 && code <= MOUSE_BTN9)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
61 mplayer_put_key_internal(code - MOUSE_BTN0 + MOUSE_BTN0_DBL);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
62 }
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
63
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
64 void mplayer_put_key(int code) {
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
65 static unsigned last_key_time[2];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
66 static int last_key[2];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
67 unsigned now = GetTimerMS();
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
68 // ignore system-doubleclick if we generate these events ourselves
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
69 if (doubleclick_time &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
70 (code & ~MP_KEY_DOWN) >= MOUSE_BTN0_DBL &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
71 (code & ~MP_KEY_DOWN) <= MOUSE_BTN9_DBL)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
72 return;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
73 mplayer_put_key_internal(code);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
74 if (code & MP_KEY_DOWN) {
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
75 code &= ~MP_KEY_DOWN;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
76 last_key[1] = last_key[0];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
77 last_key[0] = code;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
78 last_key_time[1] = last_key_time[0];
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
79 last_key_time[0] = now;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
80 if (last_key[1] == code &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
81 now - last_key_time[1] < doubleclick_time)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
82 put_double(code);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
83 return;
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
84 }
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
85 if (last_key[0] == code && last_key[1] == code &&
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
86 now - last_key_time[1] < doubleclick_time)
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
87 put_double(code);
32c3d5e3a682 Apply ancient double-click patch that nobody cares to comment on.
reimar
parents: 14077
diff changeset
88 }