22
22
#include <config.h>
31
#include <sys/types.h>
37
#include "driver-out.h"
41
#include "preferences.h"
43
typedef struct sndfile_driver {
44
gchar *filename; /* must be the first entry. is altered by audio.c (hack, hack) */
61
GtkWidget *configwidget;
65
sndfile_poll_ready_playing (gpointer data,
67
GdkInputCondition condition)
69
sndfile_driver * const d = data;
72
sf_writef_short (d->outfile, d->sndbuf, d->sndbuf_size / 4);
73
d->playtime += (double)(d->sndbuf_size) / 4 / d->p_mixfreq;
77
#ifdef WORDS_BIGENDIAN
78
audio_mix(d->sndbuf, d->sndbuf_size / 4, d->p_mixfreq, ST_MIXER_FORMAT_S16_BE | ST_MIXER_FORMAT_STEREO);
80
audio_mix(d->sndbuf, d->sndbuf_size / 4, d->p_mixfreq, ST_MIXER_FORMAT_S16_LE | ST_MIXER_FORMAT_STEREO);
86
sndfile_make_config_widgets (sndfile_driver *d)
88
GtkWidget *thing, *mainbox;
90
d->configwidget = mainbox = gtk_vbox_new(FALSE, 2);
92
thing = gtk_label_new(_("no settings (yet), sorry!"));
93
gtk_box_pack_start(GTK_BOX(mainbox), thing, FALSE, TRUE, 0);
94
gtk_widget_show(thing);
98
sndfile_getwidget (void *dp)
100
sndfile_driver * const d = dp;
102
return d->configwidget;
108
sndfile_driver *d = g_new(sndfile_driver, 1);
110
d->p_mixfreq = 44100;
112
d->p_resolution = 16;
116
sndfile_make_config_widgets(d);
124
sndfile_destroy (void *dp)
126
sndfile_driver * const d = dp;
131
gtk_widget_destroy(d->configwidget);
139
sndfile_release (void *dp)
141
sndfile_driver * const d = dp;
146
audio_poll_remove(d->polltag);
149
if(d->outfile != NULL) {
150
sf_close(d->outfile);
156
sndfile_open (void *dp)
158
sndfile_driver * const d = dp;
160
d->sfinfo.channels = 2 ;
161
d->sfinfo.samplerate = 44100 ;
162
d->sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ;
164
d->outfile = sf_open (d->filename, SFM_WRITE, &d->sfinfo);
167
error_error(_("Can't open file for writing."));
171
/* In case we're running setuid root... */
172
chown(d->filename, getuid(), getgid());
174
d->sndbuf_size = 16384;
175
d->sndbuf = malloc(d->sndbuf_size);
177
error_error("Can't allocate mix buffer.");
181
d->polltag = audio_poll_add(d->pipe[1], GDK_INPUT_WRITE, sndfile_poll_ready_playing, d);
193
sndfile_get_play_time (void *dp)
195
sndfile_driver * const d = dp;
201
sndfile_loadsettings (void *dp,
204
// sndfile_driver * const d = dp;
210
sndfile_savesettings (void *dp,
213
// sndfile_driver * const d = dp;
218
st_out_driver driver_out_file = {
219
{ "WAV Rendering Output using libsndfile",
228
sndfile_loadsettings,
229
sndfile_savesettings,
232
sndfile_get_play_time,
235
#elif !defined (NO_AUDIOFILE)
26
237
#include <stdio.h>
27
238
#include <stdlib.h>