Index: jack_mixer.py =================================================================== --- jack_mixer.py (wersja 95) +++ jack_mixer.py (kopia robocza) @@ -179,11 +179,15 @@ self.channel_remove_menu_item.set_sensitive(False) def add_channel(self, name, stereo): - channel = input_channel(self.mixer, self.gui_factory, name, stereo) - self.add_channel_precreated(channel) + try: + channel = input_channel(self.mixer, self.gui_factory, name, stereo) + self.add_channel_precreated(channel) + except Exception: + err = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "Channel creation failed") + err.run() + err.destroy() def add_channel_precreated(self, channel): - self.channels.append(channel) frame = gtk.Frame() frame.add(channel) self.hbox_inputs.pack_start(frame, False) @@ -192,6 +196,7 @@ self.channel_remove_menu.append(channel_remove_menu_item) channel_remove_menu_item.connect("activate", self.on_remove_channel, channel, channel_remove_menu_item) self.channel_remove_menu_item.set_sensitive(True) + self.channels.append(channel) def read_meters(self): for channel in self.channels: Index: jack_mixer.c =================================================================== --- jack_mixer.c (wersja 95) +++ jack_mixer.c (kopia robocza) @@ -261,6 +261,7 @@ void channel_stereo_meter_read(jack_mixer_channel_t channel, double * left_ptr, double * right_ptr) { + assert(channel_ptr); *left_ptr = value_to_db(channel_ptr->meter_left); *right_ptr = value_to_db(channel_ptr->meter_right); } @@ -276,6 +277,7 @@ { bool midi_modified; + assert(channel_ptr); midi_modified = channel_ptr->midi_modified; channel_ptr->midi_modified = false; @@ -284,6 +286,7 @@ void channel_volume_write(jack_mixer_channel_t channel, double volume) { + assert(channel_ptr); channel_ptr->volume = db_to_value(volume); calc_channel_volumes(channel_ptr); } @@ -292,11 +295,13 @@ channel_volume_read( jack_mixer_channel_t channel) { + assert(channel_ptr); return value_to_db(channel_ptr->volume); } void channel_balance_write(jack_mixer_channel_t channel, double balance) { + assert(channel_ptr); channel_ptr->balance = balance; calc_channel_volumes(channel_ptr); } @@ -305,11 +310,13 @@ channel_balance_read( jack_mixer_channel_t channel) { + assert(channel_ptr); return channel_ptr->balance; } double channel_abspeak_read(jack_mixer_channel_t channel) { + assert(channel_ptr); if (channel_ptr->NaN_detected) { return sqrt(-1); @@ -835,6 +842,7 @@ { goto exit; } + memset(channel_ptr, 0, sizeof(struct channel)); channel_ptr->mixer_ptr = mixer_ctx_ptr; @@ -853,13 +861,27 @@ port_name[channel_name_size+1] = 'L'; port_name[channel_name_size+2] = 0; channel_ptr->port_left = jack_port_register(channel_ptr->mixer_ptr->jack_client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); + if (channel_ptr->port_left == NULL) + { + free(port_name); + goto exit_free_channel; + } port_name[channel_name_size+1] = 'R'; channel_ptr->port_right = jack_port_register(channel_ptr->mixer_ptr->jack_client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); free(port_name); + if (channel_ptr->port_right == NULL) + { + jack_port_unregister(channel_ptr->mixer_ptr->jack_client, channel_ptr->port_left); + goto exit_free_channel; + } } else { channel_ptr->port_left = jack_port_register(channel_ptr->mixer_ptr->jack_client, channel_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); + if (channel_ptr->port_left == NULL) + { + goto exit_free_channel; + } } channel_ptr->stereo = stereo; @@ -917,7 +939,10 @@ goto exit; exit_free_channel: + if (channel_ptr->name) + free(channel_ptr->name); free(channel_ptr); + channel_ptr = NULL; exit: return channel_ptr; Index: channel.py =================================================================== --- channel.py (wersja 95) +++ channel.py (kopia robocza) @@ -191,8 +191,10 @@ channel.__init__(self, mixer, gui_factory, name, stereo) def realize(self): + self.channel = jack_mixer_c.add_channel(self.mixer, self.channel_name, self.stereo) + if self.channel == None: + raise Exception,"Cannot create a channel" channel.realize(self) - self.channel = jack_mixer_c.add_channel(self.mixer, self.channel_name, self.stereo) jack_mixer_c.channel_set_midi_scale(self.channel, self.slider_scale.scale) self.on_volume_changed(self.slider_adjustment)