| #ifdef HAVE_CONFIG_H |
| #include "config.h" |
| #endif |
| |
| #include <stdlib.h> |
| |
| #include "gstmikmod.h" |
| |
| static int buffer_size; |
| static SBYTE *audiobuffer = NULL; |
| extern int need_sync; |
| |
| static BOOL |
| mikmod_IsThere (void) |
| { |
| return 1; |
| } |
| |
| static BOOL |
| mikmod_Init (void) |
| { |
| buffer_size = 32768; |
| if (!(audiobuffer = (SBYTE *) g_malloc (buffer_size))) |
| return 1; |
| |
| return VC_Init (); |
| } |
| |
| static void |
| mikmod_Exit (void) |
| { |
| VC_Exit (); |
| |
| if (audiobuffer) { |
| g_free (audiobuffer); |
| audiobuffer = NULL; |
| } |
| } |
| |
| |
| static void |
| mikmod_Update (void) |
| { |
| gint length; |
| GstBuffer *outdata; |
| |
| length = VC_WriteBytes ((SBYTE *) audiobuffer, buffer_size); |
| |
| outdata = gst_buffer_new (); |
| |
| GST_BUFFER_DATA (outdata) = g_memdup (audiobuffer, length); |
| GST_BUFFER_SIZE (outdata) = length; |
| |
| GST_BUFFER_TIMESTAMP (outdata) = timestamp; |
| |
| if (need_sync == 1) { |
| /* FIXME, send a flush event or something */ |
| need_sync = 0; |
| } |
| gst_pad_push (srcpad, GST_DATA (outdata)); |
| |
| } |
| |
| static BOOL |
| mikmod_Reset (void) |
| { |
| VC_Exit (); |
| return VC_Init (); |
| } |
| |
| |
| MDRIVER drv_gst = { |
| NULL, |
| "mikmod", |
| "mikmod output driver v1.0", |
| 0, 255, |
| #if (LIBMIKMOD_VERSION > 0x030106) |
| "mikmod", |
| NULL, |
| #endif |
| mikmod_IsThere, |
| VC_SampleLoad, |
| VC_SampleUnload, |
| VC_SampleSpace, |
| VC_SampleLength, |
| mikmod_Init, |
| mikmod_Exit, |
| mikmod_Reset, |
| VC_SetNumVoices, |
| VC_PlayStart, |
| VC_PlayStop, |
| mikmod_Update, |
| NULL, |
| VC_VoiceSetVolume, |
| VC_VoiceGetVolume, |
| VC_VoiceSetFrequency, |
| VC_VoiceGetFrequency, |
| VC_VoiceSetPanning, |
| VC_VoiceGetPanning, |
| VC_VoicePlay, |
| VC_VoiceStop, |
| VC_VoiceStopped, |
| VC_VoiceGetPosition, |
| VC_VoiceRealVolume |
| }; |