misc fixes and enhancements:
Adrian Reber <adrian@lisas.de>
Ogg Vorbis support: Matthew Evans <activesx@hotmail.com>
-
+MIDI interface: Arthur Peters <amp@singingwizard.org>
+
The lowpass filter is based on a description:
reso_lop.txt: Paul Kellett <paul.kellett@maxim.abel.co.uk>
#include "tX_engine.h"
tX_audiodevice :: tX_audiodevice() : samples_per_buffer(0),
-current_buffer(0), buffer_pos(0)
+current_buffer(0), buffer_pos(0), is_open(false)
{
sample_buffer[0]=NULL;
sample_buffer[1]=NULL;
if (fd) return (1);
fd=::open(globals.oss_device, O_WRONLY, 0);
+ if (fd==-1) {
+ tX_error("tX_audiodevice_oss::open() can't open device: %s", strerror(errno));
+ return -1;
+ }
+
+ is_open=true;
+
/* setting buffer size */
buff_cfg=(globals.oss_buff_no<<16) | globals.oss_buff_size;
p=buff_cfg;
- tX_debug("tX_adudiodevice_oss::open() - buff_no: %i, buff_size: %i, buff_cfg: %08x", globals.oss_buff_no, globals.oss_buff_size, buff_cfg);
+ tX_debug("tX_audiodevice_oss::open() - buff_no: %i, buff_size: %i, buff_cfg: %08x", globals.oss_buff_no, globals.oss_buff_size, buff_cfg);
i = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &p);
ioctl(fd, SNDCTL_DSP_RESET, 0);
{
return(1);
}
+ is_open=false;
::close(fd);
fd=0;
blocksize=0;
tX_error("ALSA: Failed to access PCM device \"%s\"", pcm_name);
return -1;
}
+
+ is_open=true;
snd_pcm_hw_params_alloca(&hw_params);
}
snd_pcm_hw_params_free (hw_params);
- return snd_pcm_prepare(pcm_handle);
+ return 0; //snd_pcm_prepare(pcm_handle);
}
int tX_audiodevice_alsa :: close()
{
- snd_pcm_close(pcm_handle);
+ if (is_open) {
+ snd_pcm_close(pcm_handle);
+ }
+ is_open=false;
return 0;
}
return 0;
}
-
tX_audiodevice_alsa :: tX_audiodevice_alsa() : tX_audiodevice(),
pcm_handle(NULL) {}
int buffer_pos;
int vtt_buffer_size;
tX_engine *engine;
+ bool is_open;
int sample_rate;
tX_audiodevice();
void fill_buffer(int16_t *target_buffer, int16_t *next_target_buffer);
+ bool get_is_open() { return is_open; }
virtual void start();
virtual void play(int16_t*)=0; /* play blocked */
};
}
if (device->open()) {
- device->close();
+ if (device->get_is_open()) device->close();
delete device;
device=NULL;
return ERROR_AUDIO;
tX_debug("tX_engine::stop() - loop has stopped.");
- device->close();
+ if (device->get_is_open()) device->close();
delete device;
device=NULL;
char rc_name[PATH_MAX]="";
char device_type[16];
char indent[]="\t";
- FILE *rc;
- gzFile rz;
+ FILE *rc=NULL;
+ gzFile rz=NULL;
_store_compress_xml=0;
char tmp_xml_buffer[4096];
tX_seqpar :: init_all_graphics();
vg_init_all_non_seqpars();
- gtk_adjustment_set_value(volume_adj, 2.0-globals.volume);
+ gtk_adjustment_set_value(volume_adj, globals.volume);
gtk_adjustment_set_value(pitch_adj, globals.pitch);
sprintf(wbuf,"terminatorX - %s", strip_path(buffer));
gtk_window_set_title(GTK_WINDOW(main_window), wbuf);
gtk_adjustment_set_value(seq_adj, sequencer.get_timestamp_as_float());
}
-void seq_slider_released(GtkWidget *wid, void *d)
+gboolean seq_slider_released(GtkWidget *wid, void *d)
{
seq_adj_care=0;
gtk_widget_set_sensitive(seq_slider, 0);
sequencer.forward_to_start_timestamp(0);
gtk_widget_set_sensitive(seq_slider, 1);
seq_adj_care=1;
+
+ return FALSE;
}
void sequencer_move(GtkWidget *wid, void *d)
{
gtk_box_pack_start(GTK_BOX(right_hbox), master_vol_box, WID_DYN);
gtk_widget_show(master_vol_box);
- dumadj=(GtkAdjustment*) gtk_adjustment_new(2.0-globals.volume, 0, 2, 0.01, 0.05, 0.005);
+ dumadj=(GtkAdjustment*) gtk_adjustment_new(globals.volume, 0, 2, 0.01, 0.05, 0.005);
volume_adj=dumadj;
connect_adj(dumadj, master_volume_changed, NULL);
dummy=gtk_vscale_new(dumadj);
+ //gtk_range_set_inverted(GTK_RANGE(dummy), TRUE);
gtk_scale_set_draw_value(GTK_SCALE(dummy), False);
gtk_box_pack_end(GTK_BOX(master_vol_box), dummy, WID_FIX);
gtk_widget_show(dummy);
void tX_seqpar_master_volume :: do_update_graphics ()
{
- gtk_adjustment_set_value(volume_adj, vtt_class::master_volume);
+ gtk_adjustment_set_value(volume_adj, 2.0-vtt_class::master_volume);
}
const char * tX_seqpar_master_volume :: get_name()
res_pitch*=audiofile_pitch_correction;
speed=res_pitch;
ec_set_length(ec_length);
- tX_debug("setting pitch: rel: %lf -> res: %lf", rel_pitch, res_pitch);
}
void vtt_class :: set_autotrigger(int newstate)