- Labornetzteil AliExpress         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 241

Thema: wav Dateien: Programieren von Wiedergabe und Aufnahme

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    g++ -Wall -pthread -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads -c "tinyplay0000.c" -lshapes -lwiringPi -lrt -lpigpio -I/lib/tinyalsa/include -L/lib/tinyalsa -ltinyalsa -std=c++11 (im Verzeichnis: /home/pi/Desktop/pi/programs/soundprogs)
    tinyplay0000.c: In function ‘int check_param(pcm_params*, unsigned int, unsigned int, char*, char*)’:
    tinyplay0000.c:201:43: error: invalid conversion from ‘unsigned int’ to ‘pcm_param’ [-fpermissive]
    min = pcm_params_get_min(params, param);
    ^
    In file included from tinyplay0000.c:29:0:
    /lib/tinyalsa/include/tinyalsa/asoundlib.h:151:14: note: initializing argument 2 of ‘unsigned int pcm_params_get_min(pcm_params*, pcm_param)’
    unsigned int pcm_params_get_min(struct pcm_params *pcm_params,
    ^
    tinyplay0000.c:208:43: error: invalid conversion from ‘unsigned int’ to ‘pcm_param’ [-fpermissive]
    max = pcm_params_get_max(params, param);
    ^
    In file included from tinyplay0000.c:29:0:
    /lib/tinyalsa/include/tinyalsa/asoundlib.h:153:14: note: initializing argument 2 of ‘unsigned int pcm_params_get_max(pcm_params*, pcm_param)’
    unsigned int pcm_params_get_max(struct pcm_params *pcm_params,
    ^
    tinyplay0000.c: In function ‘int sample_is_playable(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)’:
    tinyplay0000.c:231:77: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    can_play = check_param(params, PCM_PARAM_RATE, rate, "Sample rate", "Hz");
    ^
    tinyplay0000.c:231:77: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    tinyplay0000.c:232:88: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    can_play &= check_param(params, PCM_PARAM_CHANNELS, channels, "Sample", " channels");
    ^
    tinyplay0000.c:232:88: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    tinyplay0000.c:233:84: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    can_play &= check_param(params, PCM_PARAM_SAMPLE_BITS, bits, "Bitrate", " bits");
    ^
    tinyplay0000.c:233:84: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    tinyplay0000.c:234:92: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    can_play &= check_param(params, PCM_PARAM_PERIOD_SIZE, period_size, "Period size", "Hz");
    ^
    tinyplay0000.c:234:92: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    tinyplay0000.c:235:90: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    can_play &= check_param(params, PCM_PARAM_PERIODS, period_count, "Period count", "Hz");
    ^
    tinyplay0000.c:235:90: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    tinyplay0000.c: In function ‘void play_sample(FILE*, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)’:
    tinyplay0000.c:277:25: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
    buffer = malloc(size);
    ^
    Kompilierung fehlgeschlagen.



    was ein Mist

    - - - Aktualisiert - - -

    du müßtest jetzt die dateien

    /lib/tinyalsa/libtinyalsa.so
    /lib/tinyalsa/libtinyalsa.a
    ja, habe ich.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    das ist ein c und kein c++ beispiel!
    kompilier das mal mit GCC und nicht g++.

    die fehler die hier auftreten beruhen darauf das enums in c++ klassen und nicht unsigned ints sind.
    auch die typprüfung von buffer ganz unten beruht auf dem strikterem c++ typsystem.
    Geändert von botty (21.05.2016 um 17:36 Uhr)

  3. #3
    HaWe
    Gast
    das geht dann nicht, weil wav files ein Teil eines C++ Projekts werden müssen.
    Kann man die lib umschreiben auf C++ Kompatibilität?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Es ist das Beispiel, dass nicht sauber ist, nicht die Bibliothek.

    Leider mußt Du noch was anderes machen, da habe ich nicht aufgepaßt.
    Entweder Du verschiebst die /lib/tinyalsa/libtinyalsa.* nach /usr/local/lib oder du machst einen symbolischen link in /usr/local/lib auf diese Dateien, sonst findet der Linker zur Laufzeit die Libs nicht.

    Ansonsten sollte dieses modifizierte Beispiel sich kompilieren und starten lassen, zumindest auf meinem Lappi hat das geklappt.


    Gruß
    Chris

    Code:
    /* tinyplay.c
    **
    ** Copyright 2011, The Android Open Source Project
    **
    ** Redistribution and use in source and binary forms, with or without
    ** modification, are permitted provided that the following conditions are met:
    **     * Redistributions of source code must retain the above copyright
    **       notice, this list of conditions and the following disclaimer.
    **     * Redistributions in binary form must reproduce the above copyright
    **       notice, this list of conditions and the following disclaimer in the
    **       documentation and/or other materials provided with the distribution.
    **     * Neither the name of The Android Open Source Project nor the names of
    **       its contributors may be used to endorse or promote products derived
    **       from this software withplay_cpp.cout specific prior written permission.
    **
    ** THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND
    ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ** ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE
    ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
    ** DAMAGE.
    */
    
    #include <tinyalsa/asoundlib.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <string.h>
    #include <signal.h>
    
    #define ID_RIFF 0x46464952
    #define ID_WAVE 0x45564157
    #define ID_FMT  0x20746d66
    #define ID_DATA 0x61746164
    
    struct riff_wave_header {
        uint32_t riff_id;
        uint32_t riff_sz;
        uint32_t wave_id;
    };
    
    struct chunk_header {
        uint32_t id;
        uint32_t sz;
    };
    
    struct chunk_fmt {
        uint16_t audio_format;
        uint16_t num_channels;
        uint32_t sample_rate;
        uint32_t byte_rate;
        uint16_t block_align;
        uint16_t bits_per_sample;
    };
    
    static int close = 0;
    
    void play_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels,
                     unsigned int rate, unsigned int bits, unsigned int period_size,
                     unsigned int period_count);
    
    void stream_close(int sig)
    {
        /* allow the stream to be closed gracefully */
        signal(sig, SIG_IGN);
        close = 1;
    }
    
    int main(int argc, char **argv)
    {
        FILE *file;
        struct riff_wave_header riff_wave_header;
        struct chunk_header chunk_header;
        struct chunk_fmt chunk_fmt;
        unsigned int device = 0;
        unsigned int card = 0;
        unsigned int period_size = 1024;
        unsigned int period_count = 4;
        unsigned int channels = 2;
        unsigned int rate = 48000;
        unsigned int bits = 16;
        unsigned int is_raw = 0; /* Default wav file */
        char *filename;
        int more_chunks = 1;
    
        if (argc < 2) {
            fprintf(stderr, "Usage1: %s file.wav [-D card] [-d device] [-p period_size]"
                    " [-n n_periods] \n", argv[0]);
            fprintf(stderr, "Usage2: %s file.raw [-D card] [-d device] [-p period_size] "
                    "[-n n_periods] [-c channels] [-r rate] [-b bits] -i raw \n", argv[0]);
            return 1;
        }
    
        filename = argv[1];
        file = fopen(filename, "rb");
        if (!file) {
            fprintf(stderr, "Unable to open file '%s'\n", filename);
            return 1;
        }
    
        /* parse command line arguments */
        argv += 2;
        while (*argv) {
            if (strcmp(*argv, "-d") == 0) {
                argv++;
                if (*argv)
                    device = atoi(*argv);
            }
            if (strcmp(*argv, "-p") == 0) {
                argv++;
                if (*argv)
                    period_size = atoi(*argv);
            }
            if (strcmp(*argv, "-n") == 0) {
                argv++;
                if (*argv)
                    period_count = atoi(*argv);
            }
            if (strcmp(*argv, "-D") == 0) {
                argv++;
                if (*argv)
                    card = atoi(*argv);
            }
            if (strcmp(*argv, "-c") == 0) {
                argv++;
                if (*argv)
                    channels = atoi(*argv);
            }
            if (strcmp(*argv, "-r") == 0) {
                argv++;
                if (*argv)
                    rate = atoi(*argv);
            }
            if (strcmp(*argv, "-b") == 0) {
                argv++;
                if (*argv)
                    bits = atoi(*argv);
            }
            if (strcmp(*argv, "-i") == 0) {
                argv++;
                if (*argv) {
                    if (strcasecmp(*argv, "raw") == 0) {
                        is_raw = 1;
                    }
                }
            }
            if (*argv)
                argv++;
        }
    
        if ( !is_raw ) {
            fread(&riff_wave_header, sizeof(riff_wave_header), 1, file);
            if ((riff_wave_header.riff_id != ID_RIFF) ||
                (riff_wave_header.wave_id != ID_WAVE)) {
                fprintf(stderr, "Error: '%s' is not a riff/wave file\n", filename);
                fclose(file);
                return 1;
            }
            do {
                fread(&chunk_header, sizeof(chunk_header), 1, file);
                switch (chunk_header.id) {
                case ID_FMT:
                    fread(&chunk_fmt, sizeof(chunk_fmt), 1, file);
                    /* If the format header is larger, skip the rest */
                    if (chunk_header.sz > sizeof(chunk_fmt))
                        fseek(file, chunk_header.sz - sizeof(chunk_fmt), SEEK_CUR);
                    break;
                case ID_DATA:
                    /* Stop looking for chunks */
                    more_chunks = 0;
                    break;
                default:
                    /* Unknown chunk, skip bytes */
                    fseek(file, chunk_header.sz, SEEK_CUR);
                }
            } while (more_chunks);
            channels = chunk_fmt.num_channels;
            rate = chunk_fmt.sample_rate;
            bits = chunk_fmt.bits_per_sample;
        }
    
        play_sample(file, card, device, channels, rate, bits, period_size, period_count);
    
        fclose(file);
    
        return 0;
    }
    
    int check_param(struct pcm_params *params, enum pcm_param param,
    		unsigned int value, const char *param_name, 
    		const char *param_unit)
    {
        unsigned int min;
        unsigned int max;
        int is_within_bounds = 1;
    
        min = pcm_params_get_min(params, param);
        if (value < min) {
            fprintf(stderr, "%s is %u%s, device only supports >= %u%s\n", param_name, value,
                    param_unit, min, param_unit);
            is_within_bounds = 0;
        }
    
        max = pcm_params_get_max(params, param);
        if (value > max) {
            fprintf(stderr, "%s is %u%s, device only supports <= %u%s\n", param_name, value,
                    param_unit, max, param_unit);
            is_within_bounds = 0;
        }
    
        return is_within_bounds;
    }
    
    int sample_is_playable(unsigned int card, unsigned int device, unsigned int channels,
                            unsigned int rate, unsigned int bits, unsigned int period_size,
                            unsigned int period_count)
    {
        struct pcm_params *params;
        int can_play;
    
        params = pcm_params_get(card, device, PCM_OUT);
        if (params == NULL) {
            fprintf(stderr, "Unable to open PCM device %u.\n", device);
            return 0;
        }
    
        can_play = check_param(params, PCM_PARAM_RATE, rate, "Sample rate", "Hz");
        can_play &= check_param(params, PCM_PARAM_CHANNELS, channels, "Sample", " channels");
        can_play &= check_param(params, PCM_PARAM_SAMPLE_BITS, bits, "Bitrate", " bits");
        can_play &= check_param(params, PCM_PARAM_PERIOD_SIZE, period_size, "Period size", "Hz");
        can_play &= check_param(params, PCM_PARAM_PERIODS, period_count, "Period count", "Hz");
    
        pcm_params_free(params);
    
        return can_play;
    }
    
    void play_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels,
                     unsigned int rate, unsigned int bits, unsigned int period_size,
                     unsigned int period_count)
    {
        struct pcm_config config;
        struct pcm *pcm;
        char *buffer;
        int size;
        int num_read;
    
        memset(&config, 0, sizeof(config));
        config.channels = channels;
        config.rate = rate;
        config.period_size = period_size;
        config.period_count = period_count;
        if (bits == 32)
            config.format = PCM_FORMAT_S32_LE;
        else if (bits == 16)
            config.format = PCM_FORMAT_S16_LE;
        config.start_threshold = 0;
        config.stop_threshold = 0;
        config.silence_threshold = 0;
    
        if (!sample_is_playable(card, device, channels, rate, bits, period_size, period_count)) {
            return;
        }
    
        pcm = pcm_open(card, device, PCM_OUT, &config);
        if (!pcm || !pcm_is_ready(pcm)) {
            fprintf(stderr, "Unable to open PCM device %u (%s)\n",
                    device, pcm_get_error(pcm));
            return;
        }
    
        size = pcm_frames_to_bytes(pcm, pcm_get_buffer_size(pcm));
        buffer = (char *)malloc(size);
        if (!buffer) {
            fprintf(stderr, "Unable to allocate %d bytes\n", size);
            free(buffer);
            pcm_close(pcm);
            return;
        }
    
        printf("Playing sample: %u ch, %u hz, %u bit\n", channels, rate, bits);
    
        /* catch ctrl-c to shutdown cleanly */
        signal(SIGINT, stream_close);
    
        do {
            num_read = fread(buffer, 1, size, file);
            if (num_read > 0) {
                if (pcm_write(pcm, buffer, num_read)) {
                    fprintf(stderr, "Error playing sample\n");
                    break;
                }
            }
        } while (!close && num_read > 0);
    
        free(buffer);
        pcm_close(pcm);
    }

  5. #5
    HaWe
    Gast
    Was ???
    findet nicht in /lib/ ???
    gottverdammt nochmal, was ist Linux doch ein total beschissenes Betriebssystem!


    - - - Aktualisiert - - -

    ja, jetzt lässt es sich kompilieren, aber exit mit code 127.

    Wie bringt man jetzt das Programm dazu, einen wav file abzuspielen?

    - - - Aktualisiert - - -

    also, ich gebs auf, diese tinyalsa ist einfach ein völlig unbrauchbares Programm.
    Jetzt krieg ich mit den neuen -l -I -L Parametern noch nichtmal mehr meine alten programme compiliert.
    So eine Kacke!


    Gibt es andere, einfache C/C++ API libs, um wav files abzuspielen, ohne solchen beknackten compile- und link- Einstellungen wie bei tinyalsa?
    es muss doch verdammt nochmal ein einfaches #include <XXX.h> ausreichen, verdammt!!

  6. #6
    HaWe
    Gast
    unterm Strich muss es eine C/C++ API geben, die zum wav-Abspielen per C Programmierung nicht viel mehr braucht als simple 3 Befehle:
    Code:
    fp=fopen("wavfile.wav", "r");
    playwavfile(fp);
    close(fp);
    Alles andere muss eine interne Angelegenheit der API lib sein, mit der man als Programmier-End-User nichts zu tun haben muss.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    also ich muss hier jetzt mal Linux verteidigen .. und das als alteingesessener Windows Nutzer
    Linux hat sehr wohl eine brauchbare Nutzer/Gruppen/Gast Rechteverwaltung, man muss nur mal ein wenig Hirnschmalz einsetzen um von den ewig parallelen Zugriffsrechten runterzukommen ...

    [SPOILER]einige Ordner auf meiner Festplatte haben 8 Benutzer(-gruppen) ... 0 Übersicht! In Linux lege ich einen Nutzer für NEtzwerkkram an, einen für Datenbank und einen für Webseiten Zeug. Jeder bekommt seine Ordner und für die Libs und Shared Elemente verwende ich dann einfach eine gemeinsame Gruppe mit einem dedizierten Ordner ... so habe ich maximale Sicherheit[/SPOILER]

    außerdem ist Linux weit flexibler als Windows und unter der Aufwand eines initialen (aber spürbaren) Lernaufwandes sehr produktiv einsetzbar ... der rest erklärt sich i.d.R. mit ein wenig Google für die notwendigen Komponenten, etwas "man someLib" (wenn man es per apt-get installiert hat) und der Rest ist enthusiasmus ... der RPI ist definitv nichts für mal eben schnell und sauber, sondern für absolute bastler und perfektionisten!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  8. #8
    HaWe
    Gast
    ja, für spezielle Zwecke mag das ja sein, aber es fehlt an der Möglichkeit, die Userrechte auf Wunsch auch zu vereinfachen. Dass ich als alleiniger Nutzer nicht festlegen kann, dass ich auch als "pi" immer root Rechte habe, und dann möglicherweise andere Dinge nicht mehr laufen, die nicht für root erlaubt sind, ist einfach ein Unding. Wie auch peterfido schon schrieb, das könnte man auch anders lösen, u.a. als embedded Linux oder wie auch immer. Wer viele User braucht, soll sie haben, aber dass ich meine eigenen wiringPi Programme nicht als pi starten kann vom File Manager aus, ist ein Unding, und dass ich keine Lib-Dateien verschieben kann in ein Systemverzeichnis (z.B. /lib/), ebenfalls, und dass ich ständig sudo nano brauche, um /boot/config.txt zu editieren, ebenfalls, weil es der Editor Leafpad mangels Berechtigung nicht zulässt.
    Die ganze GUI ist vollkommener Quatsch, wenn man wegen jedem Mist wieder auf das terminal und die Kommandozeile zurückgeworfen wird, wie vor hundert Jahren. Wozu hat man ne GUI, wenn ständig LeafPad und FileManger ihren Dienst versagen mangels "User-Rechten" ?

    Aber hier geht es in dem Topic ja um wav Dateien, und wie man sie mit einer C API einfach programmieren kann, ohne tonnenweise Code selber schreiben zu müssen. Eher so wie oben im Beispiel:

    fp=fopen("wavfile.wav", "r");
    playwavfile(fp);
    close(fp);


    Die API Lib kann selbstständig die Metadaten für die Wiedergabe im File lesen und ihn dann entsprechend abspielen, da muss ich mich doch nicht jedesmal haarklein selber drum kümmern müssen!

    Das hat ja auch nichts mit Linux direkt zu tun, sondern nur mit den zur Verfügung stehenden C/C++ API libs, und so was muss es jetzt einfach mal schon geben, in den 40 Jahren seit K+R.

    Allerdings hat es was mit der Raspi org zu tun, dass die nämlich endlich mal nicht nur Python, sondern auch C/C++ anständig supporten.
    Es gibt ja noch nicht mal für die meisten HATs auch C/C++ Treiber- libs, sondern nur für Python
    Geändert von HaWe (23.05.2016 um 13:22 Uhr) Grund: typos

  9. #9
    HaWe
    Gast
    es klappt immer noch nicht.

    Wo gibt es denn jetzt ein funktionierenden Code, mit dem man per tinyalsa oder was auch immer einen wav sound einfach mal eben aus einem C programm heraus abspielen kann??

  10. #10
    HaWe
    Gast
    ob es noch jemand gibt, der einfache Kommandos aus "echten originären, portierbaren" C API libs kennt oder einen Wrapper um tinyalsa Codes selber erstellen kann, damit einfaches wav abspielen mit automatischer Parametererkennung mit 1 einfachen Befehl möglich ist?

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Video Aufnahme (+12std.)
    Von highdef im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 8
    Letzter Beitrag: 03.06.2011, 11:08
  2. led ein/aus programieren
    Von anthony im Forum PIC Controller
    Antworten: 6
    Letzter Beitrag: 15.07.2008, 18:44
  3. hex-dateien in bin-dateien umwandeln
    Von roboterheld im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 02.10.2007, 21:25
  4. Richtiges Drehen einer Flasche/Dose zur Aufnahme
    Von ähM_Key im Forum Mechanik
    Antworten: 2
    Letzter Beitrag: 06.10.2006, 16:43
  5. Automatische Audio-Aufnahme
    Von the_Ghost666 im Forum Software, Algorithmen und KI
    Antworten: 6
    Letzter Beitrag: 11.09.2005, 21:27

Berechtigungen

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

LiFePO4 Speicher Test