Ah so ist das. Alles klar! Danke für die Info.
Nein. Aber immerhin kann ich die Soundkarte öffnen, initialisieren, die Parameter auslesen und das Ganze wieder schliessen. Es geht also voran
3,3V ist bei allen ARM Boards Standard, auch bei den ARM Arduinos, dem Teensy, BeagleBone Black+Blue, Pine64...
5V dagegen sind veraltet und stammen aus den AVR-Zeiten, viele Komponenten haben heute aber sogar bereits 1,8V Standard.
Aber auf den Arduinos liegt alles sauber getrennt, nur bei den Spannungs- und gpio-Pins geht beim Raspi alles durcheinander wie Kraut und Rüben. Als ob man nicht erst einen Block mit 4 GND, dann 2x 5V und dann 2x3,3V hätte machen können - und dann erst die gpios hintendran. Also nee...
Aber zurück zum Thema:
hast du schon wavs abspielen und aufnehmen können?
Ah so ist das. Alles klar! Danke für die Info.
Nein. Aber immerhin kann ich die Soundkarte öffnen, initialisieren, die Parameter auslesen und das Ganze wieder schliessen. Es geht also voran
Hallo,
das ist der Trend. Kleinere Spannung=weniger strom=weniger Leistung. Nebenbei ist der Pegel schneller von GND auf 3V3 als auf 5V0. Die nächste Stufe ist dann 1V8. Die Ausgänge sind nur als Pegel zu verarbeiten. Maximal 3mA würde ich da fließen lassen.
Mein Beispiel da oben ist nicht optimiert und soll veranschaulichen, wie man aplay steuern kann. Evtl. muss das Nice weggelassen werden, damit in aplaypipe die PID von aplay abgelegt wird. Die bräuchte man, wenn man mehrere Sounds gleichzeitig / versetzt / wie auch immer laufen hat und nicht alle auf einmal stoppen möchte. Das ist in meinem Beispiel nicht drin.
Läuft immer nur ein Sound / WAV-Datei, dann kann man auch rein mit system arbeiten.
Ungestetes Beispiel:
Code:void stopp() { system("pkill aplay"); } void wiedergabe(char dateiname[]) { char befehl[512] =""; stopp(); strcpy (befehl,"nice -1 aplay /var/musik/"); strcat(befehl,dateiname); strcat(befehl," &"); system(befehl); }
Geändert von peterfido (29.05.2016 um 20:49 Uhr)
Wenn das Herz involviert ist, steht die Logik außen vor! \/
kann man nice -1 nicht sowieso einfach rauslassen?
prio == -20...+19, 0 ist ja standard, und -1 braucht auch noch root.
system ("aplay /var/musik/dateiname &");
Also ich habe der Karte einen ziemlich fiesen Ton entlockt. Der Ton war so toll das ich ihn immer noch höre ^^.
Also wo stehe ich. Ich kann mittels ALSA die Soundkarte öffnen, die Parameter abrufen, sie beliebig setzen und vorbereiten.
An dieser Stelle käme dann das mit dem Sound. Da hatte ich den Fehler das ich nur einmal Daten gelesen habe und diese dann laufend zur Karte geschickt hatte. Lese ich das File komplett, oder auch stückweise gibt es gar keinen Ton von sich.
Letzten Endes wird die Soundkarte dann auch wieder deaktiviert.
Bliebe die Frage, wie bringe ich dem das mit den Audiodaten näher? Ich nehme an ich muss das Wav-File erst entsprechend verarbeiten. So mit Headern usw. Habe ich so aber noch nicht gemacht mit Audiodateien.
Die Spracherkennung (vergleich von Audio-Signalen) läuft meist über eine FFT (Fast Fourier Transformation), Stichwort: audio cross correlation
http://dsp.stackexchange.com/questio...es-are-similar
Grundsätzlich kann man versuchen
a) den Micro-Sound in Real time zu verarbeiten (wschl.schwierig)
b) der einfachste Weg (und der einzige, den ich mir für tinyalsa vorstellen kann), wäre aber:
die Parts mit dem Play- und dem Record-Programm wären also das erste, was du schreiben und testen musst.Code:0. überprüfen, ob du beliebige wav files überhaupt mit tinyalsa abspielen kannst , ansonsten anderes Programm 1. Code zum Aufnehmen eines .wav Files schreiben (entweder auch tinyalsa oder anderes Programm), und die Qualität vom Ergebnis testen (abspielen), ggf Aufnahmeparameter anpassen 2. a) erzeugte wav-File Daten in einen FFT-kompatiblen array passender Größe konvertieren, dann einer FFT unterwerfen (Array aus komplexen Zahlen, also 2D Array), b) dann die Transformierte weiter verarbeiten (s. mein Post oben) um Rauschen / Störfrequenzen etc. zu elimieren c) debug: zur Kontrolle die FFT auf das veränderte Ergebnis anwenden, und dann das Ergebnis wieder als wav abspeichern und abhören d) goto 2.b)... 3. Anlage einer wav-Datenbank mit verschiedenen definierten Sound/Sprach-Records als Vergleichsbasis
Tue ich doch. Als ich davon Sprach die Wav Dateien entsprechend zu verarbeiten war eigentlich gemeint, die Heder auslesen, Daraus die entsprechenden Werte für Alsa übernehemen, die Soundkarte entsprachend initialisieren, dann die Daten abspielen und Alles wieder schliessen.
Gestern Abend bin ich noch so weit gekommen, dass beim Abspielen ein kurzes Knacken zu hören ist. Kein Grund einen Luftsprung zu machen, aber immerhin ein weiterer Schritt. Hab mir gestern erst einmal angeschaut wie so ein Wav aufgebaut ist. Wie gesagt, hatte damit bislang noch nie etwas zu tun. Ich denke mal, ich übergebe da noch ein paar Parameter nicht richtig. Aber das sollte ich hin bekommen.
Erst danach kommt das mit dem Aufnehmen usw. Immer schön Schritt für Schritt!
deine Aussage
klang nicht so, als ob du schon einwandfrei abspielen und aufnehmen könntest, und erst dann kommt ja die Weiterverarbeitung.Also wo stehe ich. Ich kann mittels ALSA die Soundkarte öffnen, die Parameter abrufen, sie beliebig setzen und vorbereiten.
An dieser Stelle käme dann das mit dem Sound. Da hatte ich den Fehler das ich nur einmal Daten gelesen habe und diese dann laufend zur Karte geschickt hatte. Lese ich das File komplett, oder auch stückweise gibt es gar keinen Ton von sich.
Letzten Endes wird die Soundkarte dann auch wieder deaktiviert.
Bliebe die Frage, wie bringe ich dem das mit den Audiodaten näher? Ich nehme an ich muss das Wav-File erst entsprechend verarbeiten.
Wenn du aber schon play- und record-Code hast, dann poste ihn mal bitte!
Entweder du verstehst mich, oder ich verstehe dich falsch ^^.
Was ich sagen wollte, die Soundkarte aktivieren konnte ich schon mittels C/C++ (und Geany ^^). Nur bekam ich die Soundkarte bisher nur dazu einen schmerzhaften Ton zu produzieren. Da ich bislang von Sound-Formaten komplett 0 Ahnung hatte musste ich erst einmal lernen wie ich die wav Datei so zerpflücke, dass ich die Soundkarte mit den entsprechenden Werten (Kanäle, Bit...) initialisieren und aus der Datei dann den abspielbaren Bereich heraus nehmen muss.
Und siehe da, Mission erfüllt .
Den Code bereite ich noch ein wenig auf. So gefällt mir das nicht und schön ist das auch nicht. Dann poste ich den. Der ist dann aber minimal, geht also auf keine Fehler oder so ein.
- - - Aktualisiert - - -
Hilfe!
Ich hab gerade voll die Blockade!
Aktuell setze ich die globale Variable
Ich mag globale Variablen aber eher weniger und wollte die nun in einer Funktion verwursten. Die Funktion sollte aufgerufen werden:Code:snd_pcm_t *soundKarte;
Nur wie zur Hölle muss ich die Funktion nochmal schreiben, dass *soundKarte von der Funktion gefüllt wird?Code:soundkarteIni("plugdev:1,0", soundKarte);
Ich kriege grade voll die Krise!
ja, ich hatte dich falsch verstanden.
Jetzt aber doch wohl richtig.
und jetzt bin ich gespannt was wie bereits geht ...
Kannst du mit vllt auch mal deine Soundkarte genau verlinken? Wenn alles funktioniert mit play/record, hol ich mir die gleiche!
(oh, hat sich gerade überschnitten...)
Lesezeichen