summaryrefslogtreecommitdiffstats
path: root/ext/mikmod/drv_gst.c
blob: 2d7b8e6e964a70027f6dd2109d572bc7d009e0c5 (plain)
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
#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
};