1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
diff -ru libsndfile-1.0.28.orig/programs/sndfile-play.c libsndfile-1.0.28/programs/sndfile-play.c
--- libsndfile-1.0.28.orig/programs/sndfile-play.c 2017-04-01 09:18:02.000000000 +0200
+++ libsndfile-1.0.28/programs/sndfile-play.c 2020-11-11 13:46:51.824586591 +0100
@@ -71,10 +71,31 @@
#include <sys/ioctl.h>
#include <sys/audioio.h>
-#elif (OS_IS_WIN32 == 1)
+#elif (OS_IS_WIN32 == 1) || defined(__midipix__)
+ #include <pthread.h>
#include <windows.h>
#include <mmsystem.h>
+#ifndef INFINITE
+#define INFINITE 0xffffffff
+#endif
+
+#ifndef CALLBACK_FUNCTION
+#define CALLBACK_FUNCTION (uint32_t)0x00030000
+#endif
+
+#ifndef WAVE_MAPPER
+#define WAVE_MAPPER ((UINT)-1)
+#endif
+
+#ifndef WAVE_FORMAT_PCM
+#define WAVE_FORMAT_PCM 1
+#endif
+
+#ifndef MM_WOM_DONE
+#define MM_WOM_DONE 0x3BD
+#endif
+
#endif
#define SIGNED_SIZEOF(x) ((int) sizeof (x))
@@ -482,15 +503,16 @@
** point to data instead of short*. It plain sucks!
*/
-#if (OS_IS_WIN32 == 1)
+#if (OS_IS_WIN32 == 1) || defined(__midipix__)
#define WIN32_BUFFER_LEN (1 << 15)
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER ;
+
typedef struct
{ HWAVEOUT hwave ;
WAVEHDR whdr [2] ;
- CRITICAL_SECTION mutex ; /* to control access to BuffersInUSe */
HANDLE Event ; /* signal that a buffer is free */
short buffer [WIN32_BUFFER_LEN / sizeof (short)] ;
@@ -524,9 +546,9 @@
waveOutWrite (audio_data->hwave, (LPWAVEHDR) &(audio_data->whdr [audio_data->current]), sizeof (WAVEHDR)) ;
/* count another buffer in use */
- EnterCriticalSection (&audio_data->mutex) ;
+ pthread_mutex_lock (&mutex) ;
audio_data->BuffersInUse ++ ;
- LeaveCriticalSection (&audio_data->mutex) ;
+ pthread_mutex_unlock (&mutex) ;
/* use the other buffer next time */
audio_data->current = (audio_data->current + 1) % 2 ;
@@ -556,9 +578,9 @@
/* let main loop know a buffer is free */
if (msg == MM_WOM_DONE)
- { EnterCriticalSection (&audio_data->mutex) ;
+ { pthread_mutex_lock (&mutex) ;
audio_data->BuffersInUse -- ;
- LeaveCriticalSection (&audio_data->mutex) ;
+ pthread_mutex_unlock (&mutex) ;
SetEvent (audio_data->Event) ;
} ;
@@ -586,7 +608,6 @@
audio_data.remaining = audio_data.sfinfo.frames * audio_data.sfinfo.channels ;
audio_data.current = 0 ;
- InitializeCriticalSection (&audio_data.mutex) ;
audio_data.Event = CreateEvent (0, FALSE, FALSE, 0) ;
wf.nChannels = audio_data.sfinfo.channels ;
@@ -655,8 +676,6 @@
waveOutClose (audio_data.hwave) ;
audio_data.hwave = 0 ;
- DeleteCriticalSection (&audio_data.mutex) ;
-
sf_close (audio_data.sndfile) ;
} ;
@@ -848,7 +867,7 @@
sndio_play (argc, argv) ;
#elif (defined (sun) && defined (unix))
solaris_play (argc, argv) ;
-#elif (OS_IS_WIN32 == 1)
+#elif (OS_IS_WIN32 == 1) || defined(__midipix__)
win32_play (argc, argv) ;
#elif (defined (__MACH__) && defined (__APPLE__))
printf ("OS X 10.8 and later have a new Audio API.\n") ;
|