Hallo,
naja ein Programm (z.B. aplay) ist recht einfach zu starten.
Welche Parameter Du da abfragen willst, weiß ich nicht. Am besten den Mixer vorher einmalig einstellen. Dann braucht man das nicht mit aplay machen.
Z.B. eine USB-Soundkarte als Standard setzen: Die Datei /etc/modprobe.d/alsa-base.conf edititieren. Der USB-Eintrag muss auf 0, alle anderen auf -2 stehen. Dann ist nach einem Neustart eine evtl. vorhandene USB-Soundkarte immer Standard für Mixer und aplay.
Code:
options snd-usb-audio index=0
Dann am besten in einem Autostart-Script (z.B. /etc/rc.local) den Mixer korrekt einstellen. Ich stelle die Lautstärke oft auf 80 Prozent, da hört man weniger Nebengeräusche. Sonst hört man evtl. durch den USB-Lautsprecher den Raspi arbeiten.
Code:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
# export WIRINGPI_GPIOMEM=1
amixer cset numid=3 1
amixer -c 0 cset numid=2 on,off
amixer set PCM 80%
exit 0
Dann halt aplay von einem C-Programm aus fernsteuern. Ich nutze im Beispiel als Eingabe eine USB-Multimediatastaur.
Code:
//Kompilieren: GCC -o /var/aptest/aptest /var/aptest/aptest.c -L/usr/local/lib -lpthread
//Aufrufen mittels: nice -1 /var/aptest/aptest < /dev/input/event0 &
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/sysinfo.h>
#include <time.h>
#include <linux/input.h>
#include <pthread.h>
int ziffer=0;
int beenden=2;
int zeit=0;
int shiftl=0;
int shiftr=0;
int strgl=0;
int strgr=0;
int capsl=0;
int apid=0;
FILE* aplaypipe; /* Filehandle fuer die Pipe */
void stopp()
{
char befehl[12] ="";
strcpy (befehl,"pkill aplay");
system(befehl);
}
void wiedergabe(char dateiname[])
{
char befehl[1024] ="";
strcpy (befehl,"nice -1 aplay /var/musik/");
strcat(befehl,dateiname);
strcat(befehl," &");
stopp();
aplaypipe=popen(befehl, "r");
printf("pipe: %d\n",aplaypipe);
pclose(aplaypipe);
}
void tastatur(void *name)
{
struct input_event event;
while ((read(0, &event, sizeof(event)) > 0) && (beenden==2) ) {
if (event.type != EV_KEY) continue;
// if (event.value != EV_KEY) continue; //Nur Tastendrücke erkennen, kein Loslassen. 0=losgelassen, 1=gedrückt, 2=Wiederholung(lang gedrückt)
printf("Typ: %d; Wert: %d; Code: %d\n",event.type,event.value,event.code);
if(event.value != EV_KEY){
switch (event.code) {
case 164:wiedergabe("girlfriend.wav");break;//Play
case 166:stopp();break;//Stop
case 62:stopp();beenden=0;break; //Close
}
}
}
beenden=0;
pthread_exit((void *) 0);
}
int main(int argc, char** argv)
{
pthread_t t1;
if(pthread_create(&t1, NULL, (void *)&tastatur, (void *)"Tastatur") != 0)
{
fprintf(stderr, "Fehler bei Tastatur......\n");
exit(0);
}
while (beenden > 0)
{ sleep(1);
zeit++;
if (zeit==30)
{
zeit=0;
printf("Wieder 30 Sekunden um.\n");
}
}
usleep(50);
printf("***********Ende************\n");
return 0;
}
Die WAV-Datei liegt bei mir unter /var/musik und heißt girlfriend.wav Die Rechte sollten auf 644 stehen.
Edit:
Der Code wurd auf das Wesentliche gekürzt und enthält evtl. noch ungenutzte Variablen und Verweise.
Edit2:
Evtl. Fehler werden nicht abgefangen. (Z.B. falsch geschriebener Dateiname, falsche Dateirechte, etc)
Lesezeichen