PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : monitor-1.8.1 Problem mit Sox auf neuer Ubuntu



nepomuck
28.04.2009, 17:15
Hallo zusammen,

Ich setze nach wie vor den monitor-1.8.1 ein, da ich Frontend, Text-Logs ohne DB-Anbindung und die @rec-Funktion brauche.

Genau die @rec-Funktion macht auf einem neuen Xubuntu 9.04 mächtig Probleme. Beim Start und Ende einer @rec-Aufnahme schreibt mir "sox" die Help-Screen auf den Bildschirm -- quer über alle Alarmierungen und das Statusfenster. Währed der Aufzeichnung liegt das RAW-Audio-File im /logs-Verzeichnis. Am Ende der Aufnahme löscht monitor das RAW, aber es ist kein WAV vorhanden.

Scheinbar haben sich die sox-Parameter von Version 12.17.7, die auf Bosix (Basis: Knoppix 3.9) fehlerfrei läuft, zu 14.2.0 (Xubuntu 9.04) dermassen geändert, dass der alte Monitor damit nicht mehr klarkommt.

Ich kann mich erinnern, dass es für die.monrc einen Schlüssel für die Parameterübergabe an sox gab (REC_ARGS oder so ähnlich).

Weiss einer von euch, welche sox-Paramter man sox 14.2 mitgeben muss, damit es mit dem alten monitor-1.8.1 wieder funktioniert ?

Genügt die REC_ARGS-Option, oder muss man im Quellcode von monitor-1.8.1 herumpfuschen und neu kompilieren? Welche Parameter übergibt monitor in der Grundausstattung überhaupt an sox?

Man könnte ja zur Not auch das echte sox-Binary in sox1 umbennen, den Aufruf von Seiten des monitor über ein Shell-Skript namens sox abfangen und darin die Parameterübergabe ändern.

viele Grüße,
Andreas

PS: letzte Woche habe ich durch Eigenverschulden meinen Bosix-PC abgeschossen. Bis zu diesem Zeitpunkt lief der Rechner ohne Unterbrechung 230 Tage -- mach das mal einem Windows/FMS32-User klar :-)

nepomuck
30.04.2009, 14:09
Nachtrag:

Ich habe die wahrscheinlich schuldige Stelle im Quellcode (unixinout.c) gefunden



execlp("sox", "sox",
"-t", type, fname,
"-t", "raw", "-s", "-w", "-r", srate, "-",
NULL);


Jetzt waere ich fuer Tipps dankbar, wie ich diese Zeilen umschreiben muss, dass monitor 1.8.1 mit sox 14.2 funktioniert.

Danke,
Andreas

nepomuck
01.05.2009, 11:24
Ich verstehe das einfach nicht. Der Monitor uebergibt folgende Paramter an sox:



-v1.000000 -s -w -r 22050 -c 2 -t raw /home/ast/logs/2009-05-01_1105_2-1-1-1-1 -c 1 /home/ast/logs/2009-05-01_1105_2-1-1-1-1.wav avg -l


Die Version 14.2 akzeptiert "-w" ebenso wenig wie "-l". Doch selbst wenn man beide Parameter weglaesst, funktioniert die Umwandlung nicht. Dann versucht sox, das Output-File (.wav) als Input zu oeffnen (??).

Kennt sich jemand hier mit dem sox aus? Wie muss die passende Parameteruebergabe lauten?

Danke, Andreas

Keen
08.08.2009, 19:25
Hi,

ich hab leider die gleichen Probleme wie du. Hab inzwischen die Aufzeichnung herausgenommen, leider! In der "unixinout.c" hab ich verschiedenen Möglichkeiten durchgenommen, aber SOX mag einfach nicht. Unter Ubuntu 7.04 lief es ohne Probleme.

Nutzen andere noch die Version 1.8.1 und haben solche Probs? Schade das Monitor in der Entwicklung viel zu Aufwendig und Kompliziert wurde.

Buebchen
20.08.2009, 12:11
Ich nutze zwar sox nicht, aber lt changelog ( http://sox.cvs.sourceforge.net/sox/sox/ChangeLog?revision=1.184&view=markup) ist

-w durch -2 und

-s ist laut documentation (http://sox.sourceforge.net/sox.html) durch -e single-integer zu ersetzen

Input:
-v1.000000 : Input-Volume
-s : single-integer ( jetzt -e single-integer )
-w : 16bit (jetzt -2)
-r 22050 : sample-Rate
-c 2 : zwei Kanäle
-t raw : Raw-Format
/home/ast/logs/2009-05-01_1105_2-1-1-1-1 : Infile

Output:
-c 1 : ein Kanal
/home/ast/logs/2009-05-01_1105_2-1-1-1-1.wav : Outfile
avg : Avg Filter ? (würde ich erstmal weglassen)
-l : Linker Kanal gewünscht ( hier remx 1 mal versuchen)

Das folgende könnte gehen:


-v1.000000 -e single-integer -2 -r 22050 -c 2 -t raw /home/ast/logs/2009-05-01_1105_2-1-1-1-1 -c 1 /home/ast/logs/2009-05-01_1105_2-1-1-1-1.wav remix 1

nepomuck
20.08.2009, 13:21
-w durch -2 und
-s ist durch -e single-integer zu ersetzen

Ich fummle das in Kürze in die unixinout.c ein und probiere, was passiert.

Können wir -- falls das klappt -- diese und die fms.c-Änderung (siehe anderer Beitrag http://www.funkmeldesystem.de/foren/showthread.php?t=44477) in den Source der 1.8.1 einpflegen und das als offizielle Version "Monitor 'classic' 1.8.2" auf den Download-Seiten hinterlegen?

viele Grüße,
Andreas

Keen
21.08.2009, 06:56
Hey!

gibst du bescheid wenn es funktioniert? Hatte gerade ein paar versuche gestartet, nur wollte Sox mit "-e singel-integer" und "-2" nichts anfangen.

Buebchen
21.08.2009, 07:59
Schreibfehler gemacht. Muss -e signed-integer heissen. Der Parameter -2 sollte erkannt werden. Wenn nicht dann nimm mal -b 16 .

Wäre gut wenn Du mal die Kommandozeile posten würdest, die nicht geht. Ebenso was sox dazu dann sagt.

Muss mir den Quelltext von der Aufzeichnung wirklich mal ansehen. Speichert der tatsächlich ganzzahlig ? Ich meine die Aufnahme erfolgt mit 32bit float Werten.

Keen
21.08.2009, 08:51
Ich erlaube mir mal den dementprechenden Auszug aus der "unixinout.c" zu entnehmen.
Starten tut die Aufnahme ohne Probleme. Erst beim beenden der Aufnahme spricht er fehler aus. Letzter Fehler war bei mir irgendwas mit den Effekten. Kein Plan was genau.



void input_sound(unsigned int sample_rate, const char *ifname) {
/************************************************** *********************
* Audio-Device abfragen
************************************************** *********************/

int sndparam;
int fd;

/* verdoppelt für 2-Kanal */
union {
short s[8192 * CHANNELS];
unsigned char b[8192 * CHANNELS];
} b;

float fbuf[CHANNELS][16384];
unsigned int fbuf_cnt = 0;
int i;
short *sp;
unsigned char *bp;
int fmt = 0;
/* gfgf ==> */
time_t tp;
int rec_n, n;
void *rec_p;
/* <== */

if ((fd = open(ifname ? ifname : "/dev/dsp", O_RDONLY)) < 0) {
perror("open");
exit(10);
}
sndparam = AFMT_S16_LE; /* we want 16 bits/sample signed */
/* little endian; works only on little endian systems! */
if (ioctl(fd, SNDCTL_DSP_SETFMT, &sndparam) == -1) {
perror("ioctl: SNDCTL_DSP_SETFMT");
exit(10);
}
if (sndparam != AFMT_S16_LE) {
fmt = 1;
sndparam = AFMT_U8;
if (ioctl(fd, SNDCTL_DSP_SETFMT, &sndparam) == -1) {
perror("ioctl: SNDCTL_DSP_SETFMT");
exit(10);
}
if (sndparam != AFMT_U8) {
perror("ioctl: SNDCTL_DSP_SETFMT");
exit(10);
}
}
sndparam = 1; /* 2 Kanäle */
if (ioctl(fd, SNDCTL_DSP_STEREO, &sndparam) == -1) {
perror("ioctl: SNDCTL_DSP_STEREO");
exit(10);
}
if (sndparam != 1) {
/* Monovariante? */
fprintf(stderr, "soundif: Error, cannot set the channel "
"number to 2\n");
exit(10);
}

sndparam = sample_rate;
if (ioctl(fd, SNDCTL_DSP_SPEED, &sndparam) == -1) {
// perror("ioctl: SNDCTL_DSP_SPEED");exit(10);
}
if ((10 * abs(sndparam - sample_rate)) > sample_rate) {
// perror("ioctl: SNDCTL_DSP_SPEED");exit(10);
}

if (sndparam != sample_rate) {
fprintf(stderr, "Warning: Sampling rate is %u, "
"requested %u\n", sndparam, sample_rate);
}

#if 0
sndparam = 4;
if (ioctl(fd, SOUND_PCM_SUBDIVIDE, &sndparam) == -1) {
perror("ioctl: SOUND_PCM_SUBDIVIDE");
}
if (sndparam != 4) {
perror("ioctl: SOUND_PCM_SUBDIVIDE");
}
#endif

for (;;) {
channel = 0;
if (fmt) {
i = read(fd, bp = b.b, sizeof(b.b));
if (i < 0 && errno != EAGAIN) {
perror("read");
exit(4);
}
if (!i)
break;

if (i > 0) {

if (rec.stat) {
time(&tp);
if (tp > rec.start + rec.time)
record_stop();
else {
verbprintf(3, "Aufzeichung Kanal %c %i sec", _channel[channel], tp - rec.start);
sprintf(rec.in_args, "-u -b -r %d -c 2 -t raw", sample_rate);
rec_n = i;
rec_p = (void *) bp;
while (rec_n) {
n = write(rec.fd, rec_p, rec_n);
rec_n -= n;
rec_p += rec_n;
}
}
}

for (; i >= sizeof(b.b[0]); i -= sizeof(b.b[0] * 2), bp++) {
fbuf[0][fbuf_cnt] = ((int)(*bp++) - 0x80) * (1.0 / 128.0);
fbuf[1][fbuf_cnt++] = ((int)(*bp) - 0x80) * (1.0 / 128.0);
}

if (i)
fprintf(stderr, "warning: noninteger number of samples read\n");
if (fbuf_cnt > overlap) {
process_buffer(fbuf[0], fbuf_cnt - overlap);
memmove(fbuf[0], fbuf[0] + fbuf_cnt - overlap, overlap * sizeof(fbuf[0][0]));
channel++;
process_buffer(fbuf[1], fbuf_cnt - overlap);
memmove(fbuf[1], fbuf[1] + fbuf_cnt - overlap, overlap * sizeof(fbuf[1][0]));
fbuf_cnt = overlap;
}
}
}
else {
#ifdef ZLOG
char outprint[ITEMLEN];
#endif
i = read(fd, sp = b.s, sizeof(b.s));
if (i < 0 && errno != EAGAIN) {
/* Schliessen des Sounddevices und neustarten */
close(fd);
return;
}
#ifdef ZLOG
update_file("newbuf", LOG);
#endif
if (!i) break;
if (i > 0) {

if (rec.stat) {
time(&tp);
if (tp > rec.start + rec.time)
record_stop();
else {
verbprintf(3, "Aufzeichung Kanal %c %i sec", _channel[channel], tp - rec.start);
sprintf(rec.in_args, "-e single-integer -2 -r %d -c 2 -t raw", sample_rate);
rec_n = i;
rec_p = (void *) sp;
while(rec_n) {
n = write(rec.fd, rec_p, rec_n);
rec_n -= n;
rec_p += rec_n;
}
}
}
/* <== */
for (; i >= sizeof(b.s[0]); i -= sizeof(b.s[0]) * 2, sp++) {
fbuf[0][fbuf_cnt] = (*sp++) * (1.0 / 32768.0);
fbuf[1][fbuf_cnt++] = (*sp) * (1.0 / 32768.0);
#ifdef ZLOG
memset(outprint, 0, sizeof(outprint));
sprintf(outprint, "fbuf[%d]\t\t[li]%8.5f\t\t[re]%8.5f", fbuf_cnt-1, fbuf[0][fbuf_cnt-1], fbuf[1][fbuf_cnt-1]);
update_file(outprint, LOG);
#endif
}
if (i)
fprintf(stderr, "warning: noninteger number of samples read\n");
if (fbuf_cnt > overlap) {
process_buffer(fbuf[0], fbuf_cnt - overlap);
memmove(fbuf[0], fbuf[0] + fbuf_cnt - overlap, overlap * sizeof(fbuf[0][0]));
channel++;
process_buffer(fbuf[1], fbuf_cnt - overlap);
memmove(fbuf[1], fbuf[1] + fbuf_cnt - overlap, overlap * sizeof(fbuf[1][0]));
fbuf_cnt = overlap;
}
}
}
}
close(fd);
}
#endif /* SUN_AUDIO */



/* ------------------------------------------------------------------- */
void record_start (short *code) {
/************************************************** *********************
* Audio-Aufzeichung starten
************************************************** *********************/

char cmdline[LINELEN], buf[5];
struct tm *today;
int i = 0;

time(&tp);

if(!rec.stat) {
memmove(buf, code, 5);
today = localtime(&tp);
strftime(cmdline, 17, "%Y-%m-%d_%H%M", today);
sprintf(rec.file, "%s/%s_", rec.path, cmdline);
while(i < 5)
sprintf(rec.file, "%s%i", rec.file, code[i++]);
if((rec.fd = open(rec.file, O_WRONLY | O_CREAT | O_TRUNC, 0664)) < 0) {
fprintf(stderr, "Cannot open %s\n", rec.file);
}
rec.chan = _channel[channel] + ' ';
rec.stat = 1;
verbprintf(2, "Aufzeichung Kanal %c", _channel[channel]);
}
else
verbprintf(2, "Aufzeichung Kanal %c verlängert", _channel[channel]);

rec.start = tp;

} /* record_start


---------------------------------------------------------------------- */
void record_stop (void) {
/************************************************** *********************
* Audio-Aufzeichung abschließen
************************************************** *********************/

char cmdline[256];

close(rec.fd);
rec.stat = 0;
sprintf(cmdline, "%s -v%f %s %s %s %s%s -%c", rec.cmd, (float)rec.volume / 100, rec.in_args, rec.file,
rec.out_args, rec.file, rec.suff, rec.chan);
system(cmdline);
sprintf(cmdline, "rm %s", rec.file);
system(cmdline);
verbprintf(2, "Aufzeichung Kanal %c beendet", _channel[channel]);

} /* record_stop


Original hier: http://grohmann.gmxhome.de/mon/monitor-1.8.1.tar.gz

Buebchen
21.08.2009, 09:08
hrhr. Den Quelltext hab' ich wohl :)

Ich bin überrascht, daß Du das ganze immer direkt in der unixinout.c eingesetzt hast. Ich hab dann doch lieber erstmal sox selbst ein paar mal aufgerufen.

Das Problem ist m.E. tatsächlich die sox Version die man einsetzt. Da muss man auf jeden Fall zwischen 12, 14.0 und 14.x unterscheiden.

In der 14.0 (ubuntu8) nimmt er folgendes Kommando auf jeden Fall mal an:



sox -v1.000 -t raw -r 22050 -s -2 -c 2 <inputfile> -c1 <outputfile> mixer -l


Statt -2 nimmt er z.B. nicht das -b 16. Ebenso kennt die 14.0 noch nicht das -e signed-integer Kommando. Man muss mit -s auf den Datentyp signed-integer stellen.

Mangels realer Aufnahme kann ich nur nicht prüfen, ob dann auch etwas "hörbares" rauskommt.

Der relevante Teil im Source-Code findet sich hier:


sprintf(cmdline, "%s -v%f %s %s %s %s%s -%c", rec.cmd, (float)rec.volume / 100, rec.in_args, rec.file,
rec.out_args, rec.file, rec.suff, rec.chan);


Gilt es also noch rec.in_args und rec.out_args anzupassen und vor das -%c noch das Codewort mixer packen.


in_args und outargs. Werden auch in unixinout.c gesetzt.

Keen
21.08.2009, 09:17
Hm, ich hätte es mir denken können ;)
Ich dachte anfangs das es nur eine Kleinigkeit ist im Quellcode den "falschen" Parameter zu finden. Compiliert ist Monitor ja flott und dann kann ich es zumindest gleich im "Normalbetrieb" testen.

nepomuck
21.08.2009, 11:28
Das Problem ist m.E. tatsächlich die sox Version die man einsetzt. Da muss man auf jeden Fall zwischen 12, 14.0 und 14.x unterscheiden.

Vorschlag:

Könnte man den Monitor-1.8.1 ohne großen Aufwand so umprogrammieren, dass kein SOX-Parameter mehr im Quellcode "fest verdrahtet" ist, sondern die Software den Sox-Parametersatz aus der .monrc liest?

z.B.


#Sox 12.x
soxparms -s -w -r %rate
#Sox 14.x
#soxparms -e single-integer -2 -r %rate


Dann kann man über die Config den monitor dynamsich an die Sox-Version anpassen.

viele Grüße,
Andreas

Keen
09.12.2009, 19:20
Hi,
ist zwar schon etwas her, aber ich hab mal wieder einen Versuch gestartet eine Aufnahme zu verwirklichen. Neuere Versionen von SOX funktionieren, wie oben genannt, nicht mehr. Unter Ubuntu 9.04 hatte ich nun SOX 12.18.2 ausprobiert (Hier zu finden: http://sourceforge.net/projects/sox/files/sox/). Funktioniert bestens!

nepomuck
09.01.2010, 09:59
Unter Ubuntu 9.04 hatte ich nun SOX 12.18.2 ausprobiert. Funktioniert bestens!
Nachtrag: Die Kombination Ubuntu 9.10 mit sox 12.18.2, kompiliert aus den Sourcen geht ebenfalls.

Andreas