2010-11-25 4 views
2

Ich möchte nur den einfachsten WAV Player machen. Hier ist MyCode.Mein 10 Line Audio Player

#include <stdio.h> 

int main(){ 
    FILE* speaker = fopen("/dev/audio", "wb"); 
    FILE* music = fopen("bugsbunny2.wav", "rb"); 
    char data[16]; 
    while(!feof(music)){ 
     fread(data, sizeof(char), sizeof(data), music); 
     fwrite(data, sizeof(char), sizeof(data), speaker); 
    } 
    return 0; 
} 

Dies spielt den Sound, aber es ist zu laut. Schwer zu verstehen. Ich denke, ich vermisse auf Buffer/Chunk Größe Was ist die tatsächliche Chunk Größe? oder Wie kann ich die tatsächliche Chunk-Größe erhalten?

+0

Größe von * was * Chunk? 4 Bytes ist die Größe eines Zeigers, d. H. Sizeof (Daten). Ich würde sagen, dass Sie nie Systeme mit einer Clustergröße unter 512 Bytes sehen werden, also erstellen Sie einen Puffer von mindestens dieser Größe. – TheBlastOne

+0

Beachten Sie auch, dass Sie bis zu 3 Bytes der WAV verpassen ... denken Sie daran ... wenn Sie die Lesepuffergröße signifikant erhöhen und nicht zuerst für diesen Fehler korrigieren, werden Sie wesentlich mehr Bytes vermissen, und Bugs werden bunny klingt wie ein BUG :) – TheBlastOne

+0

Der einfachste WAV-Player ist möglicherweise eine triviale API-Funktion "Spielen Sie die wav mit diesem Dateinamen", die Windows- oder Windows-Shell wahrscheinlich anbietet. – TheBlastOne

Antwort

0

Die lokale data hat keinen zugewiesenen Speicher, aber Ihr Code liest und schreibt darauf. Auf der Grundlage der Größen sieht es jedoch so aus, als würden Sie versuchen, bei jeder Iteration der Schleife 16 Byte Speicher zu lesen und zu schreiben. Verwenden Sie das folgende statt

char data[16]; 
while(!feof(music)){ 
    fread(data, sizeof(char), sizeof(data), music); 
    fwrite(data, sizeof(char), sizeof(data), speaker); 
} 
+0

Ya ich habe das Gleiche getan. Aber es ist immer noch das Gleiche –

+0

@ user256007 gleich was? – JaredPar

+0

Das gleiche Geräusch. –

2

Ich denke, dass Sie einige grundlegende Analyse der WAV-Datei tun sollte (plus, konvertieren Bytes von Little Endian zu Big Endian, benötigt, wenn [BTW, wahrscheinlich ist dies eine Quelle der das Rauschen]) oder zumindest den Teil überspringen, der für dich nicht interessant ist, weil du jetzt überhaupt keine Ahnung mehr von der Größe der Samples in der Datei hast (zum Beispiel in einer Test-WAV-Datei, die ich bekommen habe) , Beispielgröße ist 24 Byte).

Ich empfehle Ihnen, WAV file specification zu lesen.

+0

Ya ich denke auch so. Ich lese gerade die Spezifikation. Es scheint jedoch zu komplex. Ich dachte WAV wäre zu einfach. –

+0

Nein, es ist [relativ] einfach: Sie müssen wissen, wo der Datenteil beginnt und wie viel Bytes für eine Probe ausgegeben wurden [und die Stichprobe natürlich von LE in BE umwandeln]. –

+0

Aber auch wenn ich den Header Part nicht überspringe, sollte das nicht das Problem für das ganze Audio sein. es macht nur Geräusche für die ersten paar Mikrosekunden. Aber der Rest sollte Okay sein. und ich habe auch die LEto BE Conversion gemacht. Jetzt höre ich eine lange Pause mit dem lauten Geräusch. –

0

Wie wäre es

#include <stdio.h> 

int main(){ 
    FILE* speaker = fopen("/dev/audio", "wb"); 
    FILE* music = fopen("bugsbunny2.wav", "rb"); 
    char data[16]; 
    while(!feof(music)){ 
     fwrite(data, sizeof(data), 
      fread(data, sizeof(char), sizeof(data), music), 
      speaker); 
    } 
    return 0; 
} 

?

fread gibt die Anzahl der tatsächlich gelesenen Bytes zurück.

Ich bin jedoch nicht sicher, wenn Sie nur irgendwelche WAV-Datei in das Audiogerät stopfen und nützliche Sachen hören können ... "Audio" ist kein WAV-Konsument, denke ich.

Versuchen Sie auch, Daten [1024] oder Daten [16384] zu verwenden.

Verwandte Themen