[SCM] jackd2/master: Add alsa-portnames.patch
adiknoth-guest at users.alioth.debian.org
adiknoth-guest at users.alioth.debian.org
Mon Dec 5 16:59:17 UTC 2011
The following commit has been merged in the master branch:
commit 5829b7370c59641771e6dfceef1cfc7797209056
Author: Adrian Knoth <adi at drcomp.erfurt.thur.de>
Date: Mon Dec 5 16:23:47 2011 +0100
Add alsa-portnames.patch
This patch is experimental. Right now, we don't enable it, but let's
include it here.
The idea behind the patch is to provide semantically useful portnames.
There's a different approach using a stand-alone tool (yet to be
written, proof of concept posted by yours truly).
diff --git a/debian/patches/alsa-portnames.patch b/debian/patches/alsa-portnames.patch
new file mode 100644
index 0000000..8d9a9e6
--- /dev/null
+++ b/debian/patches/alsa-portnames.patch
@@ -0,0 +1,297 @@
+--- /dev/null
++++ b/linux/alsa/port_names.c
+@@ -0,0 +1,179 @@
++/* -*- mode: c; c-file-style: "linux"; -*- */
++/*
++ Copyright (C) 2010 Florian Faber, faber at faberman.de
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++
++#include <math.h>
++#include <stdio.h>
++#include <memory.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <stdarg.h>
++#include <signal.h>
++#include <sys/types.h>
++#include <regex.h>
++#include <string.h>
++
++#include "alsa_driver.h"
++
++
++static int port_names_load_portfile(alsa_driver_t *driver, const char *filename, char **buf, const unsigned int offset, const unsigned int num) {
++ int fh, i, ret, lineno, id, res=0;
++ char line[256];
++
++ printf("Trying to load portnames from %s\n", filename);
++ fh = open(filename, O_RDONLY);
++ if (-1!=fh) {
++ res = 1;
++ i = 0;
++ lineno = 1;
++ for (;;) {
++ ret = read(fh, &line[i], 1);
++ if (0==ret) {
++ break;
++ } else if (-1==ret) {
++ sprintf(stderr, "Error while reading \"%s\": %s", filename, strerror(errno));
++ break;
++ }
++ if (0x0A==line[i]) {
++ /* new line, parse input */
++ line[i] = 0;
++
++ if ('#' != line[0]) {
++ i=0;
++ while ((i<255) && (line[i]!='=')) i++;
++ if (255==i) {
++ sprintf(stderr, "Error while reading \"%s\": Line %d has no key=value syntax!", filename, lineno);
++ } else {
++ line[i] = 0;
++ id = atoi(line);
++ if ((id>=1) && (id<=num)) {
++ if (NULL==buf[id-1+offset]) {
++ /* don't overwrite existing names */
++ buf[id-1+offset] = strdup(&line[i+1]);
++ }
++ } else {
++ sprintf(stderr, "Error while reading \"%s\": Key %d out of range in line %d (1..%d)", filename, id, lineno, num);
++ }
++ }
++ }
++
++ i = 0;
++ lineno++;
++ } else {
++ i++;
++ if (i==255) {
++ sprintf(stderr, "Error while reading \"%s\": Line %d is too long", filename, lineno);
++ break;
++ }
++ }
++ }
++
++ (void) close(fh);
++ }
++
++ return res;
++}
++
++
++static void port_names_default_portnames(char **buf, const unsigned int offset, const unsigned int num, const char *defaultname) {
++ unsigned int i;
++ char line[256];
++
++ /* Fill in default names */
++ for (i=0; i<num; i++) {
++ if (NULL==buf[i+offset]) {
++ snprintf(line, 255, defaultname, i+1);
++ buf[i+offset] = strdup(line);
++ }
++ }
++}
++
++
++char** port_names_get_portnames(alsa_driver_t *driver) {
++ snd_ctl_card_info_t *card_info;
++ int err;
++ const char *card_name = NULL;
++ char filename[256], *speed;
++ char **buf;
++
++ printf("Using port names patch v0.1 (07.04.2010)\n");
++
++ if (driver->frame_rate > 96000) {
++ speed="qs";
++ } else if (driver->frame_rate > 48000) {
++ speed="ds";
++ } else {
++ speed="ss";
++ }
++
++ snd_ctl_card_info_alloca(&card_info);
++ err = snd_ctl_card_info(driver->ctl_handle, card_info);
++ if (err >= 0) {
++ card_name = snd_ctl_card_info_get_name(card_info);
++ } else {
++ card_name = "noname";
++ }
++
++ buf = malloc(sizeof(char *)*(driver->capture_nchannels + driver->playback_nchannels));
++ if (NULL==buf) {
++ sprintf(stderr, "ALSA: Not enough memory for %d port names", driver->capture_nchannels + driver->playback_nchannels);
++ return NULL;
++ }
++ bzero(buf, sizeof(char *)*(driver->capture_nchannels + driver->playback_nchannels));
++
++ /* Read port names from special to general:
++ * Begin with user and speed specific port names */
++ snprintf(filename, 255, "%s/.config/jack/cards/%s.%s.ports.in", getenv("HOME"), card_name, speed);
++ (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels);
++
++ /* Now user general */
++ snprintf(filename, 255, "%s/.config/jack/cards/%s.ports.in", getenv("HOME"), card_name);
++ (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels);
++
++ /* System speed specific */
++ snprintf(filename, 255, "/etc/jack/cards/%s.%s.ports.in", card_name, speed);
++ (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels);
++
++ /* System general */
++ snprintf(filename, 255, "/etc/jack/cards/%s.ports.in", card_name);
++ (void) port_names_load_portfile(driver, filename, buf, 0, driver->capture_nchannels);
++
++ /* Fill all still unnamed ports with default names */
++ port_names_default_portnames(buf, 0, driver->capture_nchannels, "capture_%lu");
++
++
++ /* Same procedure for the playback channels */
++ snprintf(filename, 255, "%s/.config/jack/cards/%s.%s.ports.out", getenv("HOME"), card_name, speed);
++ (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels);
++
++ snprintf(filename, 255, "%s/.config/jack/cards/%s.ports.out", getenv("HOME"), card_name);
++ (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels);
++
++ snprintf(filename, 255, "/etc/jack/cards/%s.%s.ports.out", card_name, speed);
++ (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels);
++
++ snprintf(filename, 255, "/etc/jack/cards/%s.ports.out", card_name);
++ (void) port_names_load_portfile(driver, filename, buf, driver->capture_nchannels, driver->playback_nchannels);
++
++ port_names_default_portnames(buf, driver->capture_nchannels, driver->playback_nchannels, "playback_%lu");
++
++ return buf;
++}
+--- /dev/null
++++ b/linux/alsa/port_names.h
+@@ -0,0 +1,34 @@
++/*
++ Copyright (C) 2010 Florian Faber, faber at faberman.de
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++#ifndef __jack_port_names_h__
++#define __jack_port_names_h__
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++char** port_names_get_portnames(alsa_driver_t *driver);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __jack_port_names_h__ */
+--- a/linux/alsa/JackAlsaDriver.cpp
++++ b/linux/alsa/JackAlsaDriver.cpp
+@@ -43,6 +43,7 @@
+ #include "JackPosixThread.h"
+ #include "JackCompilerDeps.h"
+ #include "JackServerGlobals.h"
++#include "port_names.h"
+
+ namespace Jack
+ {
+@@ -72,6 +73,8 @@
+ unsigned long port_flags = (unsigned long)CaptureDriverFlags;
+ char name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE];
+ char alias[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE];
++ char old_name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE];
++ char **portnames;
+ jack_latency_range_t range;
+
+ assert(fCaptureChannels < DRIVER_PORT_NUM);
+@@ -88,15 +91,20 @@
+
+ jack_log("JackAlsaDriver::Attach fBufferSize %ld fSampleRate %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate);
+
++ portnames = port_names_get_portnames(alsa_driver);
++
+ for (int i = 0; i < fCaptureChannels; i++) {
+ snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", fAliasName, fCaptureDriverName, i + 1);
+- snprintf(name, sizeof(name) - 1, "%s:capture_%d", fClientControl.fName, i + 1);
++ snprintf(old_name, sizeof(old_name) - 1, "%s:capture_%d", fClientControl.fName, i + 1);
++ snprintf(name, sizeof(name) - 1, "%s:%s", fClientControl.fName, portnames[i]);
+ if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) {
+ jack_error("driver: cannot register port for %s", name);
+ return -1;
+ }
++ free(portnames[i]);
+ port = fGraphManager->GetPort(port_index);
+ port->SetAlias(alias);
++ port->SetAlias(old_name);
+ range.min = range.max = alsa_driver->frames_per_cycle + alsa_driver->capture_frame_latency;
+ port->SetLatencyRange(JackCaptureLatency, &range);
+ fCapturePortList[i] = port_index;
+@@ -107,13 +115,16 @@
+
+ for (int i = 0; i < fPlaybackChannels; i++) {
+ snprintf(alias, sizeof(alias) - 1, "%s:%s:in%d", fAliasName, fPlaybackDriverName, i + 1);
+- snprintf(name, sizeof(name) - 1, "%s:playback_%d", fClientControl.fName, i + 1);
++ snprintf(old_name, sizeof(old_name) - 1, "%s:playback_%d", fClientControl.fName, i + 1);
++ snprintf(name, sizeof(name) - 1, "%s:%s", fClientControl.fName, portnames[i+fCaptureChannels]);
+ if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, name, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags, fEngineControl->fBufferSize)) == NO_PORT) {
+ jack_error("driver: cannot register port for %s", name);
+ return -1;
+ }
++ free(portnames[i+fCaptureChannels]);
+ port = fGraphManager->GetPort(port_index);
+ port->SetAlias(alias);
++ port->SetAlias(old_name);
+ // Add one buffer more latency if "async" mode is used...
+ range.min = range.max = (alsa_driver->frames_per_cycle * (alsa_driver->user_nperiods - 1)) +
+ ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + alsa_driver->playback_frame_latency;
+@@ -137,6 +148,8 @@
+ }
+ }
+
++ free(portnames);
++
+ if (alsa_driver->midi) {
+ int err = (alsa_driver->midi->attach)(alsa_driver->midi);
+ if (err)
+--- a/linux/wscript
++++ b/linux/wscript
+@@ -54,6 +54,7 @@
+ 'alsa/hdsp.c',
+ 'alsa/alsa_driver.c',
+ 'alsa/hammerfall.c',
++ 'alsa/port_names.c',
+ 'alsa/ice1712.c'
+ ]
+
--
jackd2 packaging
More information about the pkg-multimedia-commits
mailing list