- LiFePO4 Speicher Test         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

Thema: Soundverarbeitung mit dem Raspi

  1. #21
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Das mit der globalen Variable gefällt mir zwar immer noch nicht aber ich bin aktuell zu doof um es anders zu regeln.

    So funktioniert es auf jeden Fall!

    Code:
    #include <alsa/asoundlib.h>
    
    #include <iostream>
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    using namespace std;
    
    typedef struct _FILE_head
    {
    	unsigned char	ID[4];
    	unsigned int	Length;
    	unsigned char	Type[4];
    } FILE_head;
    
    typedef struct _FORMAT 
    {
    	short wFormatTag;
    	unsigned short	wChannels;
    	unsigned int	dwSamplesPerSec;
    	unsigned int	dwAvgBytesPerSec;
    	unsigned short	wBlockAlign;
    	unsigned short	wBitsPerSample;
    } FORMAT;
    
    typedef struct _CHUNK_head
    {
    	unsigned char ID[4];
    	unsigned int	Length;
    } CHUNK_head;
    
    snd_pcm_t *soundKarte;
    
    bool Init(const char *name, unsigned int channels, unsigned int actualRate, unsigned short WaveBits)
    {
    	int err;
    	
    	snd_pcm_format_t bits;
    
    	unsigned int resample = 1;
    
    	switch(WaveBits)
    	{
    		case 8:
    			bits = SND_PCM_FORMAT_U8;
    			break;
    	
    		case 16:
    			bits = SND_PCM_FORMAT_S16;
    			break;
    	
    		case 24:
    			bits = SND_PCM_FORMAT_S24;
    			break;
    	
    		case 32:
    			bits = SND_PCM_FORMAT_S32;
    			break;
    	}	
    	
    	snd_pcm_hw_params_t *hw_params;
    
    	if(name == NULL)
    	{
    		err = snd_pcm_open(&soundKarte, "plughw:1,0", SND_PCM_STREAM_PLAYBACK, 0);
    	}
    	else
    	{
    		err = snd_pcm_open (&soundKarte, name, SND_PCM_STREAM_PLAYBACK, 0);
    	}
    
    	if(err < 0)
    	{
    		cout << "Init: Kann die Soundkarte nicht öffnen! " << name << " (" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    
    	if((err = snd_pcm_hw_params_malloc(&hw_params)) < 0)
    	{
    		cout << "Init: Parameter können nicht initialisiert werden (" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    
    	if((err = snd_pcm_hw_params_any(soundKarte, hw_params)) < 0)
    	{
    		cout << "Init: Parameter können nicht ermittelt werden (" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    
    	err = snd_pcm_hw_params_set_rate_resample(soundKarte, hw_params, resample);
    
    	if(err < 0)
    	{
    		cout << "Init: Resampling kann nicht eingeschaltet werden " << snd_strerror(err) << endl;
    
    		return err;
    	}
    
    	if((err = snd_pcm_hw_params_set_access(soundKarte, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
    	{
    		cout << "Init: Zugriffstyp kann nicht gesetzt werden (" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    
    	if((err = snd_pcm_hw_params_set_format(soundKarte, hw_params, bits)) < 0)
    	{
    		cout << "Init: Sample-Format kann nicht gesetzt werden (" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    
    	if((err = snd_pcm_hw_params_set_channels(soundKarte, hw_params, channels)) < 0)
    	{
    		cout << "Init: Anzahl der Kanäle kann nicht gesetzt werden (" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    
    	if((err = snd_pcm_hw_params_set_rate_near(soundKarte, hw_params, &actualRate, 0)) < 0)
    	{
    		cout << "Init: Sample-Rate kann nicht auf " << actualRate << " gesetzt werden (" << snd_strerror (err) << ")"  << endl;
    
    		return false;
    	}
    
    	if((err = snd_pcm_hw_params (soundKarte, hw_params)) < 0)
    	{
    		cout << "Init: Üarameters können nicht gesetzt werden(" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    //	snd_pcm_hw_params_get_buffer_size(hw_params, &bufferSize);
    
    	snd_pcm_hw_params_free(hw_params);
    
    	if((err = snd_pcm_prepare(soundKarte)) < 0)
    	{
    		cout << "Init: Audio kann nicht zur Nutzung vorbereitet werden (" << snd_strerror (err) << ")" << endl;
    
    		return false;
    	}
    
    	return true;
    }
    
    bool UnInit()
    {
      snd_pcm_close(soundKarte);
    
      return true;
    }
    
    int main()
    {
    	FORMAT format;
    	FILE_head head;
    	CHUNK_head chead;
    	
    	char *wave;
    
    	register snd_pcm_uframes_t count, frames;	
    	
    	int datei;
    	
    	unsigned int WaveSize;
    	
    	datei = open("/home/pi/Music/cantalow.wav", 00);
    		
    	read(datei, &head, sizeof(FILE_head));
    
    	read(datei, &chead, sizeof(CHUNK_head));
    
    	read(datei, &format, sizeof(FORMAT));
    
    	wave = (char *) malloc(head.Length);
    	
    	read(datei, wave, head.Length);
    
    	WaveSize = head.Length * 8 / ((unsigned int)format.wBitsPerSample * (unsigned int)format.wChannels);
    
    	close(datei);
    
    	Init("plughw:1,0", format.wChannels, format.dwSamplesPerSec, format.wBitsPerSample);
    	
    	count = 0;
    	
    	do
    	{
    		frames = snd_pcm_writei(soundKarte, wave + count, WaveSize - count);
    
    		if (frames < 0) frames = snd_pcm_recover(soundKarte, frames, 0);
    		if (frames < 0)
    		{
    			printf("Kann wav nicht abspielen: %s\n", snd_strerror(frames));
    			break;
    		}
    
    		count += frames;
    
    	} while (count < WaveSize);
    
    	if (count == WaveSize) snd_pcm_drain(soundKarte);
    
    	free(wave);
    
    	UnInit();
    
    	return 0;
    }

  2. #22
    HaWe
    Gast
    in welchem Ober-Verzeichnis liegt deine alsa/asoundlib.h ?
    und wie lautet deine Compile/Build Parameter Liste?

    und wo steht, was "soundKarte" ist ? Bzw. wie man das auf die eingebaute oder andere externe "Karten" umstellt?

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    52
    Beiträge
    765
    Hallo,
    Code:
    plughw:1,0
    bedeutet, die zweite verfügbare Soundkarte. Demnach darf die modprobe nicht dahin geändert werden, dass USB-Sound die erste ist. Falls das geändert wurde, dann
    Code:
    plughw:0,0
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #24
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Dazu notwendig ist (falls noch nicht vorhanden)

    Code:
    sudo apt-get install libasound2-dev
    sowie braucht es beim Linken noch

    Code:
    -lasoundlib
    für g++.

    - - - Aktualisiert - - -

    Das übergibst du bei

    Code:
    Init("plughw:1,0", format.wChannels, format.dwSamplesPerSec, format.wBitsPerSample);
    Wie Peter schon sagte, 1 ist die zweite verfügbare Soundkarte. Da Raspi eine drin hat ist diese 0. Welche Nummer die entsprechende Karte hat kannst du zum Beispiel mit

    Code:
    aplay -l
    heraus finden.

  5. #25
    HaWe
    Gast
    ok, ich hab heute abend wieder einen Pi (2).
    Wie ist jetzt der genaue komplette g++ Build-Befehl (ich verwende ja Geany, das hat aber die gleichen wie der normale make Befehl) ?

    Und in welchem Ober-Verzeichnis liegt deine alsa/asoundlib.h ?

  6. #26
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Ich verwende im Moment auch Geany. Nur mein eigentlicher Bot will cmake.

    Kompilieren:
    Code:
    g++ -Wall -std=c++0x  -pthread -lasound -c "%f"
    Erstellen:
    Code:
    g++ -Wall -std=c++0x  -pthread -lasound -o "%e" "%f"

  7. #27
    HaWe
    Gast
    was ist c++0x und warum?
    ich habe
    -std=c++11

    Und in welchem Ober-Verzeichnis liegt deine alsa/asoundlib.h ?

  8. #28
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    c++0x stand schon in der Zeile. Da habe ich hier nichts dran geändert. c++11 geht natürlich auch!

    Wenn du libasound2-dev installiert hast liegt es im Standardverzeichnis. Also ich musste da nichts ändern oder irgendwo rein kopieren.

  9. #29
    HaWe
    Gast
    ich hatte mal was installiert aber woanders hin.
    Daher muss ich wissen, wie dein Verzeichnis genau heißt und wo es liegt.

    ps, hast du auch das installiert?

    git clone https://github.com/tinyalsa/tinyalsa.git
    cd tinyalsa
    make

    - - - Aktualisiert - - -

    hmmmm
    schriebst du nicht oben, du würdest tinyalsa benutzen - oder habe ich da was falsch gelesen?
    sieht nämlich so aus, al ob du gar nicht tinyalsa benutzt, sondern das originale alsa .... kann das sein?

    - - - Aktualisiert - - -

    edit -

    alles klar, es hat mit der tinyalsa-Lib nichts zu tun!
    Dann ist es auch klar, dass das mit den lib-Pfaden nicht passte, das hat sich also erledigt.

    Gute Nachricht:
    Beispielprogramm lässt sich compilieren und läuft!

    Geändert von HaWe (30.05.2016 um 17:40 Uhr)

  10. #30
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    397
    Recht hast du. Tinyalsa mag ja gut sein, aber ohne Dokumentation ist das einfach Müll. Klar kann man es aus dem Quelltext heraus suchen, aber das ist mühsam. Also habe ich es mal mit Alsa selbst versucht und siehe da, funktioniert. Zudem finden sich für Alsa selbst hier und da Tutorials bzw. Einträge in Foren. Jedes Problem das ich hatte hatte auch schon irgend wer vor mir und von daher bekam ich in der Regel auch die Antworten dazu.

    Also weg mit Tinyalsa . Habe ich im ersten Post hier im Threat auch schon geändert.

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Ähnliche Themen

  1. Pixy Cam an RasPi per C/C++?
    Von HaWe im Forum Raspberry Pi
    Antworten: 0
    Letzter Beitrag: 20.04.2016, 09:34
  2. ARM TrustZone und Raspi 3B
    Von Hellmut im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 0
    Letzter Beitrag: 12.04.2016, 15:06
  3. Raspi Kaufberatung?
    Von hirnfrei im Forum Raspberry Pi
    Antworten: 33
    Letzter Beitrag: 08.03.2016, 08:14
  4. Antworten: 63
    Letzter Beitrag: 18.02.2016, 07:43
  5. [ERLEDIGT] Raspi Club?
    Von pofoklempner im Forum Raspberry Pi
    Antworten: 16
    Letzter Beitrag: 09.07.2015, 06:20

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad