1 /* Emacs style mode select   -*- C++ -*-
2  *-----------------------------------------------------------------------------
3  *
4  *
5  *  PrBoom: a Doom port merged with LxDoom and LSDLDoom
6  *  based on BOOM, a modified and improved DOOM engine
7  *
8  *  Copyright (C) 2011 by
9  *  Nicholai Main
10  *
11  *  This program is free software; you can redistribute it and/or
12  *  modify it under the terms of the GNU General Public License
13  *  as published by the Free Software Foundation; either version 2
14  *  of the License, or (at your option) any later version.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24  *  02111-1307, USA.
25  *
26  * DESCRIPTION:
27  *
28  *---------------------------------------------------------------------
29  */
30 
31 
32 #ifndef MUSICPLAYER_H
33 #define MUSICPLAYER_H
34 
35 /*
36 Anything that implements all of these functions can play music in prboomplus.
37 
38 render: If audio output isn't delivered by render (say, for midi out), then the
39 player won't be recordable with video capture.  In that case, still write 0s to
40 the buffer when render is called.
41 
42 thread safety: Locks are handled in i_sound.c.  Don't worry about it.
43 
44 Timing: If you're outputting to render, your timing should come solely from the
45 calls to render, and not some external timing source.  That's why things stay
46 synced.
47 */
48 
49 
50 typedef struct
51 {
52   // descriptive name of the player, such as "OPL2 Synth"
53   const char *(*name)(void);
54 
55   // samplerate is in hz.  return is 1 for success
56   int (*init)(int samplerate);
57 
58   // deallocate structures, cleanup, ...
59   void (*shutdown)(void);
60 
61   // set volume, 0 = off, 15 = max
62   void (*setvolume)(int v);
63 
64   // pause currently running song.
65   void (*pause)(void);
66 
67   // undo pause
68   void (*resume)(void);
69 
70   // return a player-specific handle, or NULL on failure.
71   // data does not belong to player, but it will persist as long as unregister is not called
72   const void *(*registersong)(const void *data, unsigned len);
73 
74   // deallocate structures, etc.  data is no longer valid
75   void (*unregistersong)(const void *handle);
76 
77   void (*play)(const void *handle, int looping);
78 
79   // stop
80   void (*stop)(void);
81 
82   // s16 stereo, with samplerate as specified in init.  player needs to be able to handle
83   // just about anything for nsamp.  render can be called even during pause+stop.
84   void (*render)(void *dest, unsigned nsamp);
85 } music_player_t;
86 
87 
88 
89 // helper for deferred load dll
90 
91 #ifdef _MSC_VER
92 #if 1
93 #define TESTDLLLOAD(a,b)
94 #else
95 #define TESTDLLLOAD(a,b)                                                           \
96   if (1)                                                                           \
97   {                                                                                \
98     HMODULE h = LoadLibrary (a);                                                   \
99     if (!h)                                                                        \
100     {                                                                              \
101       lprintf (LO_INFO, a " not found!\n");                                        \
102       return 0;                                                                    \
103     }                                                                              \
104     FreeLibrary (h);                                                               \
105     if (b && FAILED (__HrLoadAllImportsForDll (a)))                                \
106     {                                                                              \
107       lprintf (LO_INFO, "Couldn't get all symbols from " a "\n");                  \
108       return 0;                                                                    \
109     }                                                                              \
110   }
111 #endif
112 
113 #else // _MSC_VER
114 #define TESTDLLLOAD(a,b)
115 
116 #endif // _MSC_VER
117 
118 
119 
120 
121 
122 
123 
124 #endif // MUSICPLAYER_H
125