Mercurial > sdl-ios-xcode
annotate src/thread/win32/SDL_syssem.c @ 765:4c2ba6161939
Editors Note: The original patch was modified to use SDL_Delay() instead of
nanosleep because nanosleep may not be portable to all systems
using SDL with the ALSA backend. This may be a moot point with
the switch to blocking writes anyway...
Date: Sat, 27 Dec 2003 21:47:36 +0100
From: Michel Daenzer
To: Debian Bug Tracking System
Subject: [SDL] Bug#225252: [PATCH] ALSA fixes
Package: libsdl1.2debian-all
Version: 1.2.6-2
Severity: normal
Tags: patch
For SDL 1.2.6, the ALSA backend was changed to call snd_pcm_open() with
SND_PCM_NONBLOCK. That's a good idea per se, however, it causes high CPU
usage, interrupted sound and stuttering in some games here. Taking a nanosleep
whenever snd_pcm_writei() returns -EAGAIN fixes this, but I think it's more
efficient to use blocking mode for the actual sound playback. Feedback from the
SDL and ALSA lists appreciated.
The patch also fixes the default ALSA device to be used.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 04 Jan 2004 15:40:50 +0000 |
parents | f6ffac90895c |
children | b8d311d90021 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
297
f6ffac90895c
Updated copyright information for 2002
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
36
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* Semaphore functions using the Win32 API */ | |
29 | |
30 #include <stdio.h> | |
31 #include <stdlib.h> | |
32 #include <windows.h> | |
33 | |
34 #include "SDL_error.h" | |
35 #include "SDL_thread.h" | |
36 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
37 #include "win_ce_semaphore.h" |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
38 #endif |
0 | 39 |
40 | |
41 struct SDL_semaphore { | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
42 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
43 SYNCHHANDLE id; |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
44 #else |
0 | 45 HANDLE id; |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
46 #endif |
0 | 47 Uint32 volatile count; |
48 }; | |
49 | |
50 | |
51 /* Create a semaphore */ | |
52 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) | |
53 { | |
54 SDL_sem *sem; | |
55 | |
56 /* Allocate sem memory */ | |
57 sem = (SDL_sem *)malloc(sizeof(*sem)); | |
58 if ( sem ) { | |
59 /* Create the semaphore, with max value 32K */ | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
60 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
61 sem->id = CreateSemaphoreCE(NULL, initial_value, 32*1024, NULL); |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
62 #else |
0 | 63 sem->id = CreateSemaphore(NULL, initial_value, 32*1024, NULL); |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
64 #endif |
0 | 65 sem->count = initial_value; |
66 if ( ! sem->id ) { | |
67 SDL_SetError("Couldn't create semaphore"); | |
68 free(sem); | |
69 sem = NULL; | |
70 } | |
71 } else { | |
72 SDL_OutOfMemory(); | |
73 } | |
74 return(sem); | |
75 } | |
76 | |
77 /* Free the semaphore */ | |
78 void SDL_DestroySemaphore(SDL_sem *sem) | |
79 { | |
80 if ( sem ) { | |
81 if ( sem->id ) { | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
82 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
83 CloseSynchHandle(sem->id); |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
84 #else |
0 | 85 CloseHandle(sem->id); |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
86 #endif |
0 | 87 sem->id = 0; |
88 } | |
89 free(sem); | |
90 } | |
91 } | |
92 | |
93 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) | |
94 { | |
95 int retval; | |
96 DWORD dwMilliseconds; | |
97 | |
98 if ( ! sem ) { | |
99 SDL_SetError("Passed a NULL sem"); | |
100 return -1; | |
101 } | |
102 | |
103 if ( timeout == SDL_MUTEX_MAXWAIT ) { | |
104 dwMilliseconds = INFINITE; | |
105 } else { | |
106 dwMilliseconds = (DWORD)timeout; | |
107 } | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
108 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
109 switch (WaitForSemaphoreCE(sem->id, dwMilliseconds)) { |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
110 #else |
0 | 111 switch (WaitForSingleObject(sem->id, dwMilliseconds)) { |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
112 #endif |
0 | 113 case WAIT_OBJECT_0: |
114 --sem->count; | |
115 retval = 0; | |
116 break; | |
117 case WAIT_TIMEOUT: | |
118 retval = SDL_MUTEX_TIMEDOUT; | |
119 break; | |
120 default: | |
121 SDL_SetError("WaitForSingleObject() failed"); | |
122 retval = -1; | |
123 break; | |
124 } | |
125 return retval; | |
126 } | |
127 | |
128 int SDL_SemTryWait(SDL_sem *sem) | |
129 { | |
130 return SDL_SemWaitTimeout(sem, 0); | |
131 } | |
132 | |
133 int SDL_SemWait(SDL_sem *sem) | |
134 { | |
135 return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT); | |
136 } | |
137 | |
138 /* Returns the current count of the semaphore */ | |
139 Uint32 SDL_SemValue(SDL_sem *sem) | |
140 { | |
141 if ( ! sem ) { | |
142 SDL_SetError("Passed a NULL sem"); | |
143 return 0; | |
144 } | |
145 return sem->count; | |
146 } | |
147 | |
148 int SDL_SemPost(SDL_sem *sem) | |
149 { | |
150 if ( ! sem ) { | |
151 SDL_SetError("Passed a NULL sem"); | |
152 return -1; | |
153 } | |
154 /* Increase the counter in the first place, because | |
155 * after a successful release the semaphore may | |
156 * immediately get destroyed by another thread which | |
157 * is waiting for this semaphore. | |
158 */ | |
159 ++sem->count; | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
160 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
161 if ( ReleaseSemaphoreCE(sem->id, 1, NULL) == FALSE ) { |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
162 #else |
0 | 163 if ( ReleaseSemaphore(sem->id, 1, NULL) == FALSE ) { |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
164 #endif |
0 | 165 --sem->count; /* restore */ |
166 SDL_SetError("ReleaseSemaphore() failed"); | |
167 return -1; | |
168 } | |
169 return 0; | |
170 } |