-
Notifications
You must be signed in to change notification settings - Fork 1
/
seb_mikmod.c~
149 lines (129 loc) · 3.18 KB
/
seb_mikmod.c~
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
SEB MikMod encapsulation
seb_mikmod.c
*/
#include "common.h"
#include "seb_mikmod.h"
static int si_done = 0;
static int si_thread_id = -1;
static MODULE *sm_mod = NULL;
static int si_initialized = false;
extern int _mm_errno;
extern BOOL _mm_critical;
extern char *_mm_errmsg[];
void smm_error_handler (void)
{
pspDebugScreenPrintf ("_mm_critical %d\n", MikMod_critical);
pspDebugScreenPrintf ("_mm_errno %d\n", MikMod_errno);
pspDebugScreenPrintf ("%s\n", MikMod_strerror(MikMod_errno));
return;
}
static int smm_audio_channel_thread (int args, void *argp)
{
while (!si_done)
{
MikMod_Update ();
sceKernelDelayThread (1);
}
return (0);
}
int SMM_Init (void)
{
if (si_initialized == true)
{
pspDebugScreenPrintf ("MikMod already initialized\n");
return 1;
}
if (MikMod_InitThreads ())
{
pspDebugScreenPrintf ("MikMod thread init failed\n");
return -1;
}
MikMod_RegisterErrorHandler (smm_error_handler);
MikMod_RegisterAllDrivers ();
MikMod_RegisterAllLoaders ();
/* initialize the library */
md_mode = DMODE_16BITS | DMODE_STEREO | DMODE_SOFT_SNDFX | DMODE_SOFT_MUSIC;
md_reverb = 0;
md_pansep = 128;
if (MikMod_Init (""))
{
pspDebugScreenPrintf ("Could not initialize sound, reason: %s\n", MikMod_strerror (MikMod_errno));
return -2;
}
MikMod_SetNumVoices (-1, 8);
/* get ready to play */
MikMod_EnableOutput ();
si_initialized = true;
return 0;
}
int SMM_PlayMOD (char *pc_file_name)
{
if (si_initialized == false)
{
//pspDebugScreenPrintf ("MikMod library not initialized\n");
return -1;
}
// create mikmod update thread
if ((si_thread_id = sceKernelCreateThread ("MikMod", (void*)&smm_audio_channel_thread, 0x12, 0x10000, 0, NULL)) > 0)
{
sceKernelStartThread (si_thread_id, 0 , NULL);
}
else
{
//pspDebugScreenPrintf ("Play thread create failed!\n");
return -2;
}
// max_chan is hardcoded to 128
sm_mod = Player_Load (pc_file_name, 128, 0);
if (sm_mod != NULL)
{
sm_mod->wrap = 1;
Player_Start (sm_mod);
}
else
{
pspDebugScreenPrintf ("Loading MOD file %s failed!\n", pc_file_name);
return -3;
}
return 0;
}
void SMM_Stop (void)
{
if (si_initialized == false)
{
pspDebugScreenPrintf ("MikMod library not initialized\n");
return;
}
// allow audio thread to terminate cleanly
si_done = true;
if (si_thread_id > 0)
{
SceUInt timeout = 100000;
sceKernelWaitThreadEnd (si_thread_id, &timeout);
// not 100% sure if this is necessary after a clean exit, but just to make sure any resources are freed:
sceKernelDeleteThread (si_thread_id);
}
if (sm_mod != NULL)
{
Player_Stop ();
Player_Free (sm_mod);
}
si_done = 0;
si_thread_id = -1;
sm_mod = NULL;
}
void SMM_Dispose (void)
{
if (si_initialized == false)
{
pspDebugScreenPrintf ("MikMod library not initialized\n");
return;
}
if (sm_mod != NULL)
{
SMM_Stop ();
}
MikMod_Exit ();
si_initialized = false;
}