From patchwork Tue Sep 18 13:42:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emmanuel Gil Peyrot X-Patchwork-Id: 10604351 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 725E5913 for ; Tue, 18 Sep 2018 13:43:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5C96D29107 for ; Tue, 18 Sep 2018 13:43:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 506CF29157; Tue, 18 Sep 2018 13:43:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 780802916E for ; Tue, 18 Sep 2018 13:43:00 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 52055267891; Tue, 18 Sep 2018 15:42:56 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 6F2FF26788E; Tue, 18 Sep 2018 15:42:53 +0200 (CEST) Received: from jabberfr.org (jabberfr.org [62.210.214.37]) by alsa0.perex.cz (Postfix) with ESMTP id 598E8267819; Tue, 18 Sep 2018 15:42:50 +0200 (CEST) Received: from localhost (jabberfr.org [local]) by jabberfr.org (OpenSMTPD) with ESMTPA id 62427890; Tue, 18 Sep 2018 13:42:49 +0000 (UTC) From: Emmanuel Gil Peyrot To: patch@alsa-project.org Date: Tue, 18 Sep 2018 15:42:31 +0200 Message-Id: <20180918134237.8489-2-linkmauve@jabberfr.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180918134237.8489-1-linkmauve@jabberfr.org> References: <20180918134237.8489-1-linkmauve@jabberfr.org> MIME-Version: 1.0 Cc: linkmauve@linkmauve.fr, alsa-devel@alsa-project.org Subject: [alsa-devel] [PATCH - hwmixvolume v2 1/7] hwmixvolume: use four spaces instead of one tab for indent X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Gil Peyrot This is the recommended coding style for all Python programs, as specified in PEP-0008[1]. [1] https://www.python.org/dev/peps/pep-0008/ Signed-off-by: Emmanuel Gil Peyrot Reviewed-by: James Cameron diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume index ef80bc8..038bcb3 100755 --- a/hwmixvolume/hwmixvolume +++ b/hwmixvolume/hwmixvolume @@ -26,285 +26,285 @@ EVENT_INFO = alsahcontrol.event_mask['INFO'] EVENT_REMOVE = alsahcontrol.event_mask_remove class Stream: - def __init__(self, element, parent): - self.element = element - self.element.set_callback(self) - self.parent = parent - self.label = None - self.scales = [] - self.adjustments = [] - self.callback(self.element, EVENT_INFO) - - def destroy(self): - self.deactivate() - - def callback(self, e, mask): - if mask == EVENT_REMOVE: - self.deactivate() - elif (mask & EVENT_INFO) != 0: - info = alsahcontrol.Info(self.element) - if info.is_inactive: - self.deactivate() - else: - self.activate() - elif (mask & EVENT_VALUE) != 0: - self.update_scales_from_ctl() - - def activate(self): - if self.label: - return - info = alsahcontrol.Info(self.element) - value = alsahcontrol.Value(self.element) - value.read() - values = value.get_tuple(TYPE_INTEGER, info.count) - self.label = gtk.Label(self.get_label(info)) - self.label.set_single_line_mode(True) - self.parent.scales_vbox.pack_start(self.label, expand=False) - for i in range(info.count): - adj = gtk.Adjustment(value=values[i], - lower=info.min, upper=info.max, - step_incr=1, - page_incr=(info.max-info.min+1)/8) - adj.connect('value-changed', self.update_ctl_from_scale, i) - scale = gtk.HScale(adj) - scale.set_draw_value(False) - self.parent.scales_vbox.pack_start(scale, expand=False) - self.scales.append(scale) - self.adjustments.append(adj) - self.parent.scales_vbox.show_all() - self.parent.update_msg_label() - - def deactivate(self): - if not self.label: - return - self.label.destroy() - for s in self.scales: - s.destroy() - self.label = None - self.scales = [] - self.adjustments = [] - self.parent.update_msg_label() - - def update_scales_from_ctl(self): - if not self.label: - return - count = len(self.adjustments) - value = alsahcontrol.Value(self.element) - value.read() - values = value.get_tuple(TYPE_INTEGER, count) - for i in range(count): - self.adjustments[i].set_value(values[i]) - - def update_ctl_from_scale(self, adj, index): - scale_value = adj.get_value() - value_to_set = int(round(adj.get_value())) - count = len(self.adjustments) - value = alsahcontrol.Value(self.element) - if self.parent.lock_check.get_active(): - values = [value_to_set for i in range(count)] - else: - value.read() - values = value.get_array(TYPE_INTEGER, count) - values[index] = value_to_set - value.set_array(TYPE_INTEGER, values) - value.write() - if value_to_set != scale_value: - adj.set_value(value_to_set) - - def get_label(self, info): - pid = self.get_pid(info) - if pid: - cmdline = self.get_pid_cmdline(pid) - if cmdline: - return cmdline - else: - return "PID %d" % pid - else: - name = info.name - if name[-7:] == " Volume": - name = name[:-7] - if name[-9:] == " Playback": - name = name[:-9] - return name - - def get_pid(self, info): - card = self.parent.current_card - device = info.device - subdevice = info.subdevice - if subdevice == 0: - subdevice = info.index - filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice) - try: - f = open(filename, "r") - except IOError: - return None - try: - for line in f.readlines(): - if line[:9] == "owner_pid": - return int(line.split(':')[1].strip()) - finally: - f.close() - return None - - def get_pid_cmdline(self, pid): - try: - f = open("/proc/%d/cmdline" % pid, "r") - except IOError: - return None - try: - cmdline = f.read() - finally: - f.close() - return cmdline.replace('\x00', ' ').strip() + def __init__(self, element, parent): + self.element = element + self.element.set_callback(self) + self.parent = parent + self.label = None + self.scales = [] + self.adjustments = [] + self.callback(self.element, EVENT_INFO) + + def destroy(self): + self.deactivate() + + def callback(self, e, mask): + if mask == EVENT_REMOVE: + self.deactivate() + elif (mask & EVENT_INFO) != 0: + info = alsahcontrol.Info(self.element) + if info.is_inactive: + self.deactivate() + else: + self.activate() + elif (mask & EVENT_VALUE) != 0: + self.update_scales_from_ctl() + + def activate(self): + if self.label: + return + info = alsahcontrol.Info(self.element) + value = alsahcontrol.Value(self.element) + value.read() + values = value.get_tuple(TYPE_INTEGER, info.count) + self.label = gtk.Label(self.get_label(info)) + self.label.set_single_line_mode(True) + self.parent.scales_vbox.pack_start(self.label, expand=False) + for i in range(info.count): + adj = gtk.Adjustment(value=values[i], + lower=info.min, upper=info.max, + step_incr=1, + page_incr=(info.max-info.min+1)/8) + adj.connect('value-changed', self.update_ctl_from_scale, i) + scale = gtk.HScale(adj) + scale.set_draw_value(False) + self.parent.scales_vbox.pack_start(scale, expand=False) + self.scales.append(scale) + self.adjustments.append(adj) + self.parent.scales_vbox.show_all() + self.parent.update_msg_label() + + def deactivate(self): + if not self.label: + return + self.label.destroy() + for s in self.scales: + s.destroy() + self.label = None + self.scales = [] + self.adjustments = [] + self.parent.update_msg_label() + + def update_scales_from_ctl(self): + if not self.label: + return + count = len(self.adjustments) + value = alsahcontrol.Value(self.element) + value.read() + values = value.get_tuple(TYPE_INTEGER, count) + for i in range(count): + self.adjustments[i].set_value(values[i]) + + def update_ctl_from_scale(self, adj, index): + scale_value = adj.get_value() + value_to_set = int(round(adj.get_value())) + count = len(self.adjustments) + value = alsahcontrol.Value(self.element) + if self.parent.lock_check.get_active(): + values = [value_to_set for i in range(count)] + else: + value.read() + values = value.get_array(TYPE_INTEGER, count) + values[index] = value_to_set + value.set_array(TYPE_INTEGER, values) + value.write() + if value_to_set != scale_value: + adj.set_value(value_to_set) + + def get_label(self, info): + pid = self.get_pid(info) + if pid: + cmdline = self.get_pid_cmdline(pid) + if cmdline: + return cmdline + else: + return "PID %d" % pid + else: + name = info.name + if name[-7:] == " Volume": + name = name[:-7] + if name[-9:] == " Playback": + name = name[:-9] + return name + + def get_pid(self, info): + card = self.parent.current_card + device = info.device + subdevice = info.subdevice + if subdevice == 0: + subdevice = info.index + filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice) + try: + f = open(filename, "r") + except IOError: + return None + try: + for line in f.readlines(): + if line[:9] == "owner_pid": + return int(line.split(':')[1].strip()) + finally: + f.close() + return None + + def get_pid_cmdline(self, pid): + try: + f = open("/proc/%d/cmdline" % pid, "r") + except IOError: + return None + try: + cmdline = f.read() + finally: + f.close() + return cmdline.replace('\x00', ' ').strip() class MixerWindow(gtk.Window): - card_numbers = alsacard.card_list() - current_card = -1 - hcontrol = None - scales_vbox = None - msg_label = None - streams = [] - hctl_sources = [] - - def __init__(self): - gtk.Window.__init__(self) - self.connect('destroy', lambda w: gtk.main_quit()) - self.set_title("Hardware Mixer Volumes") - - vbox = gtk.VBox() - self.add(vbox) - - hbox = gtk.HBox() - vbox.pack_start(hbox, expand=False) - - label = gtk.Label("_Sound Card: ") - label.set_use_underline(True) - hbox.pack_start(label, expand=False) - - combo = gtk.combo_box_new_text() - for i in self.card_numbers: - str = "%d: %s" % (i, alsacard.card_get_name(i)) - combo.append_text(str) - if len(self.card_numbers) > 0: - combo.set_active(0) - combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()])) - hbox.pack_start(combo) - label.set_mnemonic_widget(combo) - - self.lock_check = gtk.CheckButton(label="_Lock Channels") - self.lock_check.set_active(True) - vbox.pack_start(self.lock_check, expand=False) - - scrollwin = gtk.ScrolledWindow() - scrollwin.set_policy(hscrollbar_policy=gtk.POLICY_NEVER, vscrollbar_policy=gtk.POLICY_AUTOMATIC) - scrollwin.set_shadow_type(gtk.SHADOW_NONE) - vbox.pack_start(scrollwin) - - self.scales_vbox = gtk.VBox() - scrollwin.add_with_viewport(self.scales_vbox) - - label = gtk.Label() - label.set_single_line_mode(True) - line_height = label.size_request()[1] - label.destroy() - scale = gtk.HScale() - scale.set_draw_value(False) - line_height += scale.size_request()[1] - scale.destroy() - # always have space for at least four sliders - scrollwin.set_size_request(width=-1, height=line_height*4+4) - - # TODO: select the default card or the first card with stream controls - if len(self.card_numbers) > 0: - self.change_card(self.card_numbers[0]) - self.update_msg_label() - - self.show_all() - - def change_card(self, cardnum): - for s in self.hctl_sources: - gobject.source_remove(s) - self.hctl_sources = [] - - self.hcontrol = self.open_hcontrol_for_card(cardnum) - - for s in self.streams: - s.destroy() - self.streams = [] - - self.current_card = cardnum - - if not self.hcontrol: - self.update_msg_label() - return - - for id in self.hcontrol.list(): - if not self.is_stream_elem(id): - continue - elem = alsahcontrol.Element(self.hcontrol, id[0]) - info = alsahcontrol.Info(elem) - if not self.is_stream_info(info): - continue - stream = Stream(elem, self) - self.streams.append(stream) - - for fd,condition in self.hcontrol.poll_fds: - self.hctl_sources.append(gobject.io_add_watch(fd, condition, self.hctl_io_callback)) - - self.update_msg_label() - - self.scales_vbox.show_all() - - def update_msg_label(self): - needs_msg = len(self.scales_vbox.get_children()) < 2 - has_msg = self.msg_label - if has_msg and not needs_msg: - self.msg_label.destroy() - self.msg_label = None - elif needs_msg: - if len(self.streams) > 0: - msg = "There are no open streams." - else: - msg = "This card does not have stream controls." - if not has_msg: - self.msg_label = gtk.Label(msg) - self.scales_vbox.pack_start(self.msg_label) - self.scales_vbox.show_all() - elif self.msg_label.get_text() != msg: - self.msg_label.set_text(msg) - - def open_hcontrol_for_card(self, cardnum): - devname = "hw:CARD=" + str(cardnum) - try: - hc = alsahcontrol.HControl(name=devname, - mode=alsahcontrol.open_mode['NONBLOCK']) - except: - # TODO: alsa error msg - dlg = gtk.MessageDialog(self, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, - "Cannot open sound card control device.") - dlg.run() - dlg.destroy() - return None - return hc - - def is_stream_elem(self, id): - return ((id[1] == INTF_PCM and - id[4] in ("PCM Playback Volume", "EMU10K1 PCM Volume")) or - (id[1] == INTF_MIXER and - id[4] == "VIA DXS Playback Volume")) - - def is_stream_info(self, info): - return info.is_readable and info.is_writable and info.type == TYPE_INTEGER - - def hctl_io_callback(self, source, condition): - self.hcontrol.handle_events() - return True + card_numbers = alsacard.card_list() + current_card = -1 + hcontrol = None + scales_vbox = None + msg_label = None + streams = [] + hctl_sources = [] + + def __init__(self): + gtk.Window.__init__(self) + self.connect('destroy', lambda w: gtk.main_quit()) + self.set_title("Hardware Mixer Volumes") + + vbox = gtk.VBox() + self.add(vbox) + + hbox = gtk.HBox() + vbox.pack_start(hbox, expand=False) + + label = gtk.Label("_Sound Card: ") + label.set_use_underline(True) + hbox.pack_start(label, expand=False) + + combo = gtk.combo_box_new_text() + for i in self.card_numbers: + str = "%d: %s" % (i, alsacard.card_get_name(i)) + combo.append_text(str) + if len(self.card_numbers) > 0: + combo.set_active(0) + combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()])) + hbox.pack_start(combo) + label.set_mnemonic_widget(combo) + + self.lock_check = gtk.CheckButton(label="_Lock Channels") + self.lock_check.set_active(True) + vbox.pack_start(self.lock_check, expand=False) + + scrollwin = gtk.ScrolledWindow() + scrollwin.set_policy(hscrollbar_policy=gtk.POLICY_NEVER, vscrollbar_policy=gtk.POLICY_AUTOMATIC) + scrollwin.set_shadow_type(gtk.SHADOW_NONE) + vbox.pack_start(scrollwin) + + self.scales_vbox = gtk.VBox() + scrollwin.add_with_viewport(self.scales_vbox) + + label = gtk.Label() + label.set_single_line_mode(True) + line_height = label.size_request()[1] + label.destroy() + scale = gtk.HScale() + scale.set_draw_value(False) + line_height += scale.size_request()[1] + scale.destroy() + # always have space for at least four sliders + scrollwin.set_size_request(width=-1, height=line_height*4+4) + + # TODO: select the default card or the first card with stream controls + if len(self.card_numbers) > 0: + self.change_card(self.card_numbers[0]) + self.update_msg_label() + + self.show_all() + + def change_card(self, cardnum): + for s in self.hctl_sources: + gobject.source_remove(s) + self.hctl_sources = [] + + self.hcontrol = self.open_hcontrol_for_card(cardnum) + + for s in self.streams: + s.destroy() + self.streams = [] + + self.current_card = cardnum + + if not self.hcontrol: + self.update_msg_label() + return + + for id in self.hcontrol.list(): + if not self.is_stream_elem(id): + continue + elem = alsahcontrol.Element(self.hcontrol, id[0]) + info = alsahcontrol.Info(elem) + if not self.is_stream_info(info): + continue + stream = Stream(elem, self) + self.streams.append(stream) + + for fd,condition in self.hcontrol.poll_fds: + self.hctl_sources.append(gobject.io_add_watch(fd, condition, self.hctl_io_callback)) + + self.update_msg_label() + + self.scales_vbox.show_all() + + def update_msg_label(self): + needs_msg = len(self.scales_vbox.get_children()) < 2 + has_msg = self.msg_label + if has_msg and not needs_msg: + self.msg_label.destroy() + self.msg_label = None + elif needs_msg: + if len(self.streams) > 0: + msg = "There are no open streams." + else: + msg = "This card does not have stream controls." + if not has_msg: + self.msg_label = gtk.Label(msg) + self.scales_vbox.pack_start(self.msg_label) + self.scales_vbox.show_all() + elif self.msg_label.get_text() != msg: + self.msg_label.set_text(msg) + + def open_hcontrol_for_card(self, cardnum): + devname = "hw:CARD=" + str(cardnum) + try: + hc = alsahcontrol.HControl(name=devname, + mode=alsahcontrol.open_mode['NONBLOCK']) + except: + # TODO: alsa error msg + dlg = gtk.MessageDialog(self, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, + "Cannot open sound card control device.") + dlg.run() + dlg.destroy() + return None + return hc + + def is_stream_elem(self, id): + return ((id[1] == INTF_PCM and + id[4] in ("PCM Playback Volume", "EMU10K1 PCM Volume")) or + (id[1] == INTF_MIXER and + id[4] == "VIA DXS Playback Volume")) + + def is_stream_info(self, info): + return info.is_readable and info.is_writable and info.type == TYPE_INTEGER + + def hctl_io_callback(self, source, condition): + self.hcontrol.handle_events() + return True def main(): - MixerWindow() - gtk.main() + MixerWindow() + gtk.main() main() From patchwork Tue Sep 18 13:42:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Emmanuel Gil Peyrot X-Patchwork-Id: 10604353 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9AA2A913 for ; Tue, 18 Sep 2018 13:43:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 88AEC29161 for ; Tue, 18 Sep 2018 13:43:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7BEEA2916B; Tue, 18 Sep 2018 13:43:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A184129161 for ; Tue, 18 Sep 2018 13:43:09 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 7A1C62678A7; Tue, 18 Sep 2018 15:43:00 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 3D90C267891; Tue, 18 Sep 2018 15:42:55 +0200 (CEST) Received: from jabberfr.org (jabberfr.org [62.210.214.37]) by alsa0.perex.cz (Postfix) with ESMTP id 8DDB826788C; Tue, 18 Sep 2018 15:42:52 +0200 (CEST) Received: from localhost (jabberfr.org [local]) by jabberfr.org (OpenSMTPD) with ESMTPA id 3e06427d; Tue, 18 Sep 2018 13:42:51 +0000 (UTC) From: Emmanuel Gil Peyrot To: patch@alsa-project.org Date: Tue, 18 Sep 2018 15:42:32 +0200 Message-Id: <20180918134237.8489-3-linkmauve@jabberfr.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180918134237.8489-1-linkmauve@jabberfr.org> References: <20180918134237.8489-1-linkmauve@jabberfr.org> MIME-Version: 1.0 Cc: linkmauve@linkmauve.fr, alsa-devel@alsa-project.org Subject: [alsa-devel] [PATCH - hwmixvolume v2 2/7] hwmixvolume: replace PyGTK with gobject-introspection X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Gil Peyrot This doesn’t work yet, we require Gtk 3.0 rather than 2.0 and the API changed quite a lot, so this is but a preparatory patch. This is done so that we can get rid of GTK+ 2 which has been EOL for many years already, and to add Python 3 support because Python 2 will very soon be EOL as well. Signed-off-by: Emmanuel Gil Peyrot diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume index 038bcb3..64d232c 100755 --- a/hwmixvolume/hwmixvolume +++ b/hwmixvolume/hwmixvolume @@ -15,7 +15,10 @@ # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -import gobject, gtk +import gi +gi.require_version('GLib', '2.0') +gi.require_version('Gtk', '3.0') +from gi.repository import GLib, Gtk from pyalsa import alsacard, alsahcontrol INTF_PCM = alsahcontrol.interface_id['PCM'] @@ -57,16 +60,16 @@ class Stream: value = alsahcontrol.Value(self.element) value.read() values = value.get_tuple(TYPE_INTEGER, info.count) - self.label = gtk.Label(self.get_label(info)) + self.label = Gtk.Label(self.get_label(info)) self.label.set_single_line_mode(True) self.parent.scales_vbox.pack_start(self.label, expand=False) for i in range(info.count): - adj = gtk.Adjustment(value=values[i], + adj = Gtk.Adjustment(value=values[i], lower=info.min, upper=info.max, step_incr=1, page_incr=(info.max-info.min+1)/8) adj.connect('value-changed', self.update_ctl_from_scale, i) - scale = gtk.HScale(adj) + scale = Gtk.HScale(adj) scale.set_draw_value(False) self.parent.scales_vbox.pack_start(scale, expand=False) self.scales.append(scale) @@ -157,7 +160,7 @@ class Stream: f.close() return cmdline.replace('\x00', ' ').strip() -class MixerWindow(gtk.Window): +class MixerWindow(Gtk.Window): card_numbers = alsacard.card_list() current_card = -1 hcontrol = None @@ -167,21 +170,21 @@ class MixerWindow(gtk.Window): hctl_sources = [] def __init__(self): - gtk.Window.__init__(self) - self.connect('destroy', lambda w: gtk.main_quit()) + Gtk.Window.__init__(self) + self.connect('destroy', lambda w: Gtk.main_quit()) self.set_title("Hardware Mixer Volumes") - vbox = gtk.VBox() + vbox = Gtk.VBox() self.add(vbox) - hbox = gtk.HBox() + hbox = Gtk.HBox() vbox.pack_start(hbox, expand=False) - label = gtk.Label("_Sound Card: ") + label = Gtk.Label("_Sound Card: ") label.set_use_underline(True) hbox.pack_start(label, expand=False) - combo = gtk.combo_box_new_text() + combo = Gtk.combo_box_new_text() for i in self.card_numbers: str = "%d: %s" % (i, alsacard.card_get_name(i)) combo.append_text(str) @@ -191,23 +194,23 @@ class MixerWindow(gtk.Window): hbox.pack_start(combo) label.set_mnemonic_widget(combo) - self.lock_check = gtk.CheckButton(label="_Lock Channels") + self.lock_check = Gtk.CheckButton(label="_Lock Channels") self.lock_check.set_active(True) vbox.pack_start(self.lock_check, expand=False) - scrollwin = gtk.ScrolledWindow() - scrollwin.set_policy(hscrollbar_policy=gtk.POLICY_NEVER, vscrollbar_policy=gtk.POLICY_AUTOMATIC) - scrollwin.set_shadow_type(gtk.SHADOW_NONE) + scrollwin = Gtk.ScrolledWindow() + scrollwin.set_policy(hscrollbar_policy=Gtk.POLICY_NEVER, vscrollbar_policy=Gtk.POLICY_AUTOMATIC) + scrollwin.set_shadow_type(Gtk.SHADOW_NONE) vbox.pack_start(scrollwin) - self.scales_vbox = gtk.VBox() + self.scales_vbox = Gtk.VBox() scrollwin.add_with_viewport(self.scales_vbox) - label = gtk.Label() + label = Gtk.Label() label.set_single_line_mode(True) line_height = label.size_request()[1] label.destroy() - scale = gtk.HScale() + scale = Gtk.HScale() scale.set_draw_value(False) line_height += scale.size_request()[1] scale.destroy() @@ -223,7 +226,7 @@ class MixerWindow(gtk.Window): def change_card(self, cardnum): for s in self.hctl_sources: - gobject.source_remove(s) + GLib.source_remove(s) self.hctl_sources = [] self.hcontrol = self.open_hcontrol_for_card(cardnum) @@ -249,7 +252,7 @@ class MixerWindow(gtk.Window): self.streams.append(stream) for fd,condition in self.hcontrol.poll_fds: - self.hctl_sources.append(gobject.io_add_watch(fd, condition, self.hctl_io_callback)) + self.hctl_sources.append(GLib.io_add_watch(fd, condition, self.hctl_io_callback)) self.update_msg_label() @@ -267,7 +270,7 @@ class MixerWindow(gtk.Window): else: msg = "This card does not have stream controls." if not has_msg: - self.msg_label = gtk.Label(msg) + self.msg_label = Gtk.Label(msg) self.scales_vbox.pack_start(self.msg_label) self.scales_vbox.show_all() elif self.msg_label.get_text() != msg: @@ -280,9 +283,9 @@ class MixerWindow(gtk.Window): mode=alsahcontrol.open_mode['NONBLOCK']) except: # TODO: alsa error msg - dlg = gtk.MessageDialog(self, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, + dlg = Gtk.MessageDialog(self, + Gtk.DIALOG_MODAL | Gtk.DIALOG_DESTROY_WITH_PARENT, + Gtk.MESSAGE_ERROR, Gtk.BUTTONS_OK, "Cannot open sound card control device.") dlg.run() dlg.destroy() @@ -304,7 +307,7 @@ class MixerWindow(gtk.Window): def main(): MixerWindow() - gtk.main() + Gtk.main() main() From patchwork Tue Sep 18 13:42:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emmanuel Gil Peyrot X-Patchwork-Id: 10604355 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 63ADB13AD for ; Tue, 18 Sep 2018 13:43:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 50AA029107 for ; Tue, 18 Sep 2018 13:43:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4391329161; Tue, 18 Sep 2018 13:43:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E42929163 for ; Tue, 18 Sep 2018 13:43:17 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id F14082678AF; Tue, 18 Sep 2018 15:43:01 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 70F0526789B; Tue, 18 Sep 2018 15:42:57 +0200 (CEST) Received: from jabberfr.org (jabberfr.org [62.210.214.37]) by alsa0.perex.cz (Postfix) with ESMTP id B9D60267819; Tue, 18 Sep 2018 15:42:54 +0200 (CEST) Received: from localhost (jabberfr.org [local]) by jabberfr.org (OpenSMTPD) with ESMTPA id 7e94d012; Tue, 18 Sep 2018 13:42:52 +0000 (UTC) From: Emmanuel Gil Peyrot To: patch@alsa-project.org Date: Tue, 18 Sep 2018 15:42:33 +0200 Message-Id: <20180918134237.8489-4-linkmauve@jabberfr.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180918134237.8489-1-linkmauve@jabberfr.org> References: <20180918134237.8489-1-linkmauve@jabberfr.org> MIME-Version: 1.0 Cc: linkmauve@linkmauve.fr, alsa-devel@alsa-project.org Subject: [alsa-devel] =?utf-8?q?=5BPATCH_-_hwmixvolume_v2_3/7=5D_hwmixvolume?= =?utf-8?q?=3A_switch_to_GTK+=C2=A03=2E0_and_GLib=C2=A02=2E0?= X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Gil Peyrot This replaces VBox and HBox with Grid (using Gtk.Orientation), HScale with Scale, creates labels with mnemonics, set hexpand and vexpand properly, use the correct enum container classes, use the correct getter for size request, and finally update to the correct GLib watch function. Signed-off-by: Emmanuel Gil Peyrot diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume index 64d232c..8e0b6b8 100755 --- a/hwmixvolume/hwmixvolume +++ b/hwmixvolume/hwmixvolume @@ -60,18 +60,18 @@ class Stream: value = alsahcontrol.Value(self.element) value.read() values = value.get_tuple(TYPE_INTEGER, info.count) - self.label = Gtk.Label(self.get_label(info)) + self.label = Gtk.Label.new(self.get_label(info)) self.label.set_single_line_mode(True) - self.parent.scales_vbox.pack_start(self.label, expand=False) + self.parent.scales_vbox.add(self.label) for i in range(info.count): adj = Gtk.Adjustment(value=values[i], lower=info.min, upper=info.max, step_incr=1, page_incr=(info.max-info.min+1)/8) adj.connect('value-changed', self.update_ctl_from_scale, i) - scale = Gtk.HScale(adj) + scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adj) scale.set_draw_value(False) - self.parent.scales_vbox.pack_start(scale, expand=False) + self.parent.scales_vbox.add(scale) self.scales.append(scale) self.adjustments.append(adj) self.parent.scales_vbox.show_all() @@ -174,45 +174,48 @@ class MixerWindow(Gtk.Window): self.connect('destroy', lambda w: Gtk.main_quit()) self.set_title("Hardware Mixer Volumes") - vbox = Gtk.VBox() + vbox = Gtk.Grid() + vbox.set_orientation(Gtk.Orientation.VERTICAL) self.add(vbox) - hbox = Gtk.HBox() - vbox.pack_start(hbox, expand=False) + hbox = Gtk.Grid() + vbox.add(hbox) - label = Gtk.Label("_Sound Card: ") - label.set_use_underline(True) - hbox.pack_start(label, expand=False) + label = Gtk.Label.new_with_mnemonic("_Sound Card: ") + hbox.add(label) - combo = Gtk.combo_box_new_text() + combo = Gtk.ComboBoxText() + combo.set_hexpand(True) for i in self.card_numbers: str = "%d: %s" % (i, alsacard.card_get_name(i)) combo.append_text(str) if len(self.card_numbers) > 0: combo.set_active(0) combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()])) - hbox.pack_start(combo) + hbox.add(combo) label.set_mnemonic_widget(combo) - self.lock_check = Gtk.CheckButton(label="_Lock Channels") + self.lock_check = Gtk.CheckButton.new_with_mnemonic(label="_Lock Channels") self.lock_check.set_active(True) - vbox.pack_start(self.lock_check, expand=False) + vbox.add(self.lock_check) scrollwin = Gtk.ScrolledWindow() - scrollwin.set_policy(hscrollbar_policy=Gtk.POLICY_NEVER, vscrollbar_policy=Gtk.POLICY_AUTOMATIC) - scrollwin.set_shadow_type(Gtk.SHADOW_NONE) - vbox.pack_start(scrollwin) + scrollwin.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC) + scrollwin.set_shadow_type(Gtk.ShadowType.NONE) + scrollwin.set_vexpand(True) + vbox.add(scrollwin) - self.scales_vbox = Gtk.VBox() - scrollwin.add_with_viewport(self.scales_vbox) + self.scales_vbox = Gtk.Grid() + self.scales_vbox.set_orientation(Gtk.Orientation.VERTICAL) + scrollwin.add(self.scales_vbox) label = Gtk.Label() label.set_single_line_mode(True) - line_height = label.size_request()[1] + line_height = max(label.get_size_request().height, 0) label.destroy() - scale = Gtk.HScale() + scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL) scale.set_draw_value(False) - line_height += scale.size_request()[1] + line_height += max(scale.get_size_request().height, 0) scale.destroy() # always have space for at least four sliders scrollwin.set_size_request(width=-1, height=line_height*4+4) @@ -252,7 +255,7 @@ class MixerWindow(Gtk.Window): self.streams.append(stream) for fd,condition in self.hcontrol.poll_fds: - self.hctl_sources.append(GLib.io_add_watch(fd, condition, self.hctl_io_callback)) + self.hctl_sources.append(GLib.io_add_watch(fd, 0, GLib.IOCondition(condition), self.hctl_io_callback)) self.update_msg_label() @@ -270,8 +273,9 @@ class MixerWindow(Gtk.Window): else: msg = "This card does not have stream controls." if not has_msg: - self.msg_label = Gtk.Label(msg) - self.scales_vbox.pack_start(self.msg_label) + self.msg_label = Gtk.Label.new(msg) + self.msg_label.set_vexpand(True) + self.scales_vbox.add(self.msg_label) self.scales_vbox.show_all() elif self.msg_label.get_text() != msg: self.msg_label.set_text(msg) @@ -284,8 +288,8 @@ class MixerWindow(Gtk.Window): except: # TODO: alsa error msg dlg = Gtk.MessageDialog(self, - Gtk.DIALOG_MODAL | Gtk.DIALOG_DESTROY_WITH_PARENT, - Gtk.MESSAGE_ERROR, Gtk.BUTTONS_OK, + Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, + Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "Cannot open sound card control device.") dlg.run() dlg.destroy() From patchwork Tue Sep 18 13:42:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Emmanuel Gil Peyrot X-Patchwork-Id: 10604357 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 74FF013AD for ; Tue, 18 Sep 2018 13:43:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 63AC529107 for ; Tue, 18 Sep 2018 13:43:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 57C6B29178; Tue, 18 Sep 2018 13:43:25 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9F9A329107 for ; Tue, 18 Sep 2018 13:43:24 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id C88DA2678BB; Tue, 18 Sep 2018 15:43:03 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id A439A2678A7; Tue, 18 Sep 2018 15:42:59 +0200 (CEST) Received: from jabberfr.org (jabberfr.org [62.210.214.37]) by alsa0.perex.cz (Postfix) with ESMTP id E3EC926789F; Tue, 18 Sep 2018 15:42:56 +0200 (CEST) Received: from localhost (jabberfr.org [local]) by jabberfr.org (OpenSMTPD) with ESMTPA id 754b4e2e; Tue, 18 Sep 2018 13:42:52 +0000 (UTC) From: Emmanuel Gil Peyrot To: patch@alsa-project.org Date: Tue, 18 Sep 2018 15:42:34 +0200 Message-Id: <20180918134237.8489-5-linkmauve@jabberfr.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180918134237.8489-1-linkmauve@jabberfr.org> References: <20180918134237.8489-1-linkmauve@jabberfr.org> MIME-Version: 1.0 Cc: linkmauve@linkmauve.fr, alsa-devel@alsa-project.org Subject: [alsa-devel] [PATCH - hwmixvolume v2 4/7] hwmixvolume: use a with context to open files X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Gil Peyrot This feature has been added in Python 2.5 and automatically closes an open file once the context exits. Signed-off-by: Emmanuel Gil Peyrot diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume index 8e0b6b8..7f8ba8e 100755 --- a/hwmixvolume/hwmixvolume +++ b/hwmixvolume/hwmixvolume @@ -138,26 +138,20 @@ class Stream: subdevice = info.index filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice) try: - f = open(filename, "r") + with open(filename, "r") as f: + for line in f: + if line[:9] == "owner_pid": + return int(line.split(':')[1].strip()) except IOError: return None - try: - for line in f.readlines(): - if line[:9] == "owner_pid": - return int(line.split(':')[1].strip()) - finally: - f.close() return None def get_pid_cmdline(self, pid): try: - f = open("/proc/%d/cmdline" % pid, "r") + with open("/proc/%d/cmdline" % pid, "r") as f: + cmdline = f.read() except IOError: return None - try: - cmdline = f.read() - finally: - f.close() return cmdline.replace('\x00', ' ').strip() class MixerWindow(Gtk.Window): From patchwork Tue Sep 18 13:42:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Emmanuel Gil Peyrot X-Patchwork-Id: 10604359 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 90852913 for ; Tue, 18 Sep 2018 13:43:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7E7CC29820 for ; Tue, 18 Sep 2018 13:43:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 72B15298FF; Tue, 18 Sep 2018 13:43:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 04A3729820 for ; Tue, 18 Sep 2018 13:43:32 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 56C6D2678AD; Tue, 18 Sep 2018 15:43:08 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 9E62E26789B; Tue, 18 Sep 2018 15:43:05 +0200 (CEST) Received: from jabberfr.org (jabberfr.org [62.210.214.37]) by alsa0.perex.cz (Postfix) with ESMTP id 20E1026789E; Tue, 18 Sep 2018 15:43:00 +0200 (CEST) Received: from localhost (jabberfr.org [local]) by jabberfr.org (OpenSMTPD) with ESMTPA id 4fa903e0; Tue, 18 Sep 2018 13:42:59 +0000 (UTC) From: Emmanuel Gil Peyrot To: patch@alsa-project.org Date: Tue, 18 Sep 2018 15:42:35 +0200 Message-Id: <20180918134237.8489-6-linkmauve@jabberfr.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180918134237.8489-1-linkmauve@jabberfr.org> References: <20180918134237.8489-1-linkmauve@jabberfr.org> MIME-Version: 1.0 Cc: linkmauve@linkmauve.fr, alsa-devel@alsa-project.org Subject: [alsa-devel] [PATCH - hwmixvolume v2 5/7] hwmixvolume: switch the shebang to python X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Gil Peyrot This signifies that this code is now compatible with both Python 2 and Python 3, as per PEP-0394[1]. [1] https://www.python.org/dev/peps/pep-0394/ Signed-off-by: Emmanuel Gil Peyrot diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume index 7f8ba8e..4804a9b 100755 --- a/hwmixvolume/hwmixvolume +++ b/hwmixvolume/hwmixvolume @@ -1,4 +1,4 @@ -#!/usr/bin/python2 +#!/usr/bin/env python # hwmixvolume - ALSA hardware mixer volume control applet # Copyright (c) 2009-2010 Clemens Ladisch From patchwork Tue Sep 18 13:42:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emmanuel Gil Peyrot X-Patchwork-Id: 10604361 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0DAB2913 for ; Tue, 18 Sep 2018 13:43:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F085929969 for ; Tue, 18 Sep 2018 13:43:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E4CD829D9F; Tue, 18 Sep 2018 13:43:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E5CA29969 for ; Tue, 18 Sep 2018 13:43:38 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id C68082678AB; Tue, 18 Sep 2018 15:43:09 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id F1E8526789F; Tue, 18 Sep 2018 15:43:05 +0200 (CEST) Received: from jabberfr.org (jabberfr.org [62.210.214.37]) by alsa0.perex.cz (Postfix) with ESMTP id 5DB892678B6; Tue, 18 Sep 2018 15:43:02 +0200 (CEST) Received: from localhost (jabberfr.org [local]) by jabberfr.org (OpenSMTPD) with ESMTPA id e655b044; Tue, 18 Sep 2018 13:43:00 +0000 (UTC) From: Emmanuel Gil Peyrot To: patch@alsa-project.org Date: Tue, 18 Sep 2018 15:42:36 +0200 Message-Id: <20180918134237.8489-7-linkmauve@jabberfr.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180918134237.8489-1-linkmauve@jabberfr.org> References: <20180918134237.8489-1-linkmauve@jabberfr.org> MIME-Version: 1.0 Cc: linkmauve@linkmauve.fr, alsa-devel@alsa-project.org Subject: [alsa-devel] [PATCH - hwmixvolume v2 6/7] hwmixvolume: add my copyright X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Gil Peyrot Signed-off-by: Emmanuel Gil Peyrot diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume index 4804a9b..871c2c5 100755 --- a/hwmixvolume/hwmixvolume +++ b/hwmixvolume/hwmixvolume @@ -2,6 +2,7 @@ # hwmixvolume - ALSA hardware mixer volume control applet # Copyright (c) 2009-2010 Clemens Ladisch +# Copyright (c) 2018 Emmanuel Gil Peyrot # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above From patchwork Tue Sep 18 13:42:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Emmanuel Gil Peyrot X-Patchwork-Id: 10604363 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AFA1613AD for ; Tue, 18 Sep 2018 13:43:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 603E629969 for ; Tue, 18 Sep 2018 13:43:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5468F29D9F; Tue, 18 Sep 2018 13:43:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DF1BC29969 for ; Tue, 18 Sep 2018 13:43:44 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 212B82678C3; Tue, 18 Sep 2018 15:43:11 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 7827226789F; Tue, 18 Sep 2018 15:43:07 +0200 (CEST) Received: from jabberfr.org (jabberfr.org [62.210.214.37]) by alsa0.perex.cz (Postfix) with ESMTP id A5331267892; Tue, 18 Sep 2018 15:43:04 +0200 (CEST) Received: from localhost (jabberfr.org [local]) by jabberfr.org (OpenSMTPD) with ESMTPA id 3af2e4b6; Tue, 18 Sep 2018 13:43:02 +0000 (UTC) From: Emmanuel Gil Peyrot To: patch@alsa-project.org Date: Tue, 18 Sep 2018 15:42:37 +0200 Message-Id: <20180918134237.8489-8-linkmauve@jabberfr.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180918134237.8489-1-linkmauve@jabberfr.org> References: <20180918134237.8489-1-linkmauve@jabberfr.org> MIME-Version: 1.0 Cc: linkmauve@linkmauve.fr, alsa-devel@alsa-project.org Subject: [alsa-devel] [PATCH - hwmixvolume v2 7/7] hwmixvolume: mention the new dependencies in the README X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Gil Peyrot Signed-off-by: Emmanuel Gil Peyrot diff --git a/hwmixvolume/README b/hwmixvolume/README index 9884ec2..56c7554 100644 --- a/hwmixvolume/README +++ b/hwmixvolume/README @@ -8,7 +8,8 @@ that use hardware mixing, i.e., those based on the following chips: * Yamaha DS-1 (YMF-724/740/744/754) (driver: snd-ymfpci) -This tool requires Python, pygtk, and alsa-pyton 1.0.22 or later. +This tool requires Python, PyGObject, GTK+ 3.0 or later, and alsa-python 1.0.22 +or later. It is recommended to use at least Linux kernel 2.6.32 or alsa-driver 1.0.22; otherwise, the name of the program that is using a stream cannot be shown.