- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 27

Thema: Wav Dateien und kein Ende

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397

    Wav Dateien und kein Ende

    Mahlzeit!

    Ich werde verrückt echt! Bislang hatte ich mich nie gross um bestehende Formate gekümmert. Meine Programme haben in der Regel immer ihre eigenen Formate erstellt, konnten die dann logischerweise auch lesen usw. Jetzt stehe ich vor dem Problem ein Wav einlesen zu wollen. Das geht prinzipiell gut, die Header bekomme ich alle wie es sein soll und eigentlich die Daten auch. Spiele ich die nach dem Einlesen direkt über die Soundkarte ab funktioniert das auch tadellos. Nur will ich ja mit den Daten auch arbeiten, diese manipulieren können und da scheitert es komplett bei mir.

    Gebe ich den Inhalt der Wav als Return aus einer Funktion heraus, bekomme ich nur Schrott. Denke ich mal. Will ich das Array dann (samt Header natürlich!) wieder in einer anderen Funktion abspielen kommt es entweder zu einem schrillen Piiiiiiiiiiiep oder zu einem Speicherzugriffsfehler. Wenn ich mir das Array anschaue stelle ich auch fest, dass nur ein Viertel seiner Grösse auch mit Daten gefüllt sind. Der Rest sind 0 und dann stürzt das Programm auch ab, obwohl das Array mittels Malloc soger ein klein wenig mehr Speicher bekommen hat, wie es laut Header eigentlich bräuchte.

    Kann mir da bitte bitte einer unter die Arme greifen? Irgendwo übersehe ich was und ich habe nicht den blassesten Schimmer wo...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    52
    Beiträge
    765
    Hallo,

    ganz so ohne compilierbaren Code wird da keiner wirklich helfen können. Das wäre zu spekulativ. Dann fehlen noch Details. Wie groß ist das Array und wieviel wird davon zurückgegeben / behalten. Evtl. lässt sich da das Limit für die Arraygrößen erkennen. Du gibst doch bestimmt nur den Zeiger auf das Array zurück und lässt nicht wirklich den ganzen Array von einer in die andere Variable kopieren >> Siehst Du, ich muss schon spekulieren
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Also der Code um die Datei zu lesen und zu dekodieren sieht so aus:

    Code:
    int32_t *loadWave(char *waveDatei, FILE_head& head, FORMAT &format, CHUNK_head &chead)
    {
    	register snd_pcm_uframes_t count, frames;	
    	
    	int datei;
    	
    	int32_t *waveBuffer;
    
    	datei = open(waveDatei, 00);
    
    	if(datei)
    	{
    		read(datei, &head, sizeof(FILE_head));
    
    		read(datei, &chead, sizeof(CHUNK_head));
    
    		read(datei, &format, sizeof(FORMAT));
    
    		waveBuffer = (int32_t *) malloc(head.Length);
    		
    		head.Length = read(datei, waveBuffer, head.Length) - 1;
    
    		close(datei);
    		
    		return waveBuffer;
    	}
    	
    	return (int32_t *) -1;
    }

  4. #4
    HaWe
    Gast
    ich würde erstmal alles blind aus dem File byte-weise in einen byte-array einlesen, und dann erst später den Array nach Header und Daten zerpflücken, dann die wav-Daten isolieren / separieren und in einen int32_t array umkopieren:
    Code:
    #include <stdio.h>
    
    long  read_wavfile(FILE * fp)
    {
      uint8_t   c, cbuf[SHRT_MAX*4];  // byte array, oversized
      long      n=0;
    
      fp = fopen ("myfile.wav","r");  // oder über popen() und Zenity
      do {    
          cbuf[n++] = c = fgetc(fp);
        } while ( (c != EOF) && (n<SHRT_MAX*4 -1) );
      close(fp);
      return n;
    }

    jetzt Header ignorieren, dann Anfang der wav-Daten suchen (Position x), und dann Daten ab x in den int32_t input-Array rüberkopieren (ab Pos. 0).


    (nur als grobe Idee)
    Geändert von HaWe (26.06.2016 um 19:21 Uhr) Grund: c+p Fehler

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    So ähnlich hatte ich es schon und hatte dann am Ende den selben Effekt.

    Code:
    while ( (c != EOF) && (n<SHRT_MAX*4 -1) );
    Dieser Teil lässt mich schliessen das es dir in erster Linie um selbst erstellte Wave-Dateien geht?

  6. #6
    HaWe
    Gast
    eigentlich nicht, denn dann würde sogar ein kleinerer cbuf array reichen - so hätte man aber sogar noch reichlich Spielraum für Stereo und höhere Sample-Raten.


    edit:
    Längere Arrays dürfen es aber dann wirklich nicht sein, denn es wird ja später auf SHRT_MAX Daten-Werte zurückgeschnitten.

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 27.01.2016, 11:42
  2. IAA 2015: Roboterautos brauchen kein Gaspedal und kein Lenkrad
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 18.09.2015, 18:00
  3. Babylon und kein Ende
    Von oberallgeier im Forum Offtopic und Community Tratsch
    Antworten: 3
    Letzter Beitrag: 09.11.2012, 21:47
  4. MOSFET für Powerboad (5m länge, 14kW, KEIN Modellboot) 100V 100A P-Ch und kein SMD
    Von Schmidtbot im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 8
    Letzter Beitrag: 14.04.2012, 10:54
  5. tini26 timer1 und kein ende
    Von magic33 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 26.02.2007, 16:17

Berechtigungen

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

Labornetzteil AliExpress