Ergebnis 1 bis 14 von 14

Thema: monitor-1.8.1 Problem mit Sox auf neuer Ubuntu

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registriert seit
    11.12.2001
    Beiträge
    1.008
    Ich nutze zwar sox nicht, aber lt changelog ( http://sox.cvs.sourceforge.net/sox/s...84&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:
    Code:
    -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

  2. #2
    Registriert seit
    21.08.2005
    Beiträge
    251
    Zitat Zitat von Buebchen Beitrag anzeigen
    -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/...ad.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

  3. #3
    Keen Gast
    Hey!

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

  4. #4
    Registriert seit
    11.12.2001
    Beiträge
    1.008
    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.
    Geändert von Buebchen (21.08.2009 um 08:07 Uhr)

  5. #5
    Keen Gast
    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

  6. #6
    Registriert seit
    11.12.2001
    Beiträge
    1.008
    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:

    Code:
    sox -v1.000 -t raw -r 22050 -s -2 -c 2  -c1  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:
    Code:
    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.

  7. #7
    Keen Gast
    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.

  8. #8
    Registriert seit
    21.08.2005
    Beiträge
    251
    Zitat Zitat von Buebchen Beitrag anzeigen
    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.
    Code:
    #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

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •