Hallo!
Ich programmiere einen mp3-Player den man über ein kleines LCD Display mit 4 Buttons ansteuern kann. Hierzu verwende ich den Player imp3sh. Den imp3sh Player kann man über named pipes Steuerbefehle schicken um ihm zu sagen was er machen soll (PLAY, STOP, NEXT SONG, LOAD PLAYLIST, etc.).
In meinem C-Programm habe ich eine handler-Funktion mit der ich auf Buttonevents reagieren kann.
Gut das ist der Hintergrund des Programms. Jetzt mal zu meinem Problem.
Ich habe eine Funktion geschrieben in der ich den Player initialisiere. Dort werden alle meine Playlist geladen.
In initialize_player() allokiere ich mir Speicher mittels calloc() für zwei char Zeiger, die ich weiter unten wieder mit free() freigebe. Hier bekomme ich aber bei der Ausführung einen Segmentaion fault (siehe rotes Kommentar)
Mir ist nicht klar warum?
Der Code der Funktion sieht so aus:
void initialize_player() {
system("cd /music/ && ls -1p *.lst > /music/all_playlists");
FILE *my_stream;
char my_filename[] = "/music/all_playlists";
char *my_string;
my_string = (char *) calloc (100, sizeof(char));
char *imp3sh_command;
imp3sh_command = (char *) calloc (100, sizeof(char));
printf("\t\t\t\n---> DEBUGGING <---\n");
// delete all playlists
write_imp3in("dellist all\n");
int number_of_playlists = 0;
my_stream = fopen(my_filename, "r");
char *addlist;
char *uselist;
char *loadlist;
while( fgets (my_string, 100, my_stream) != NULL) {
number_of_playlists++;
//addlist to imp3sh
addlist = (char *) calloc (5, sizeof("addlist ") );
strcat(addlist, "addlist ");
strcat(addlist, my_string);
strcat(addlist, "\n");
write_imp3in(addlist);
free(addlist);
//uselist to imp3sh
uselist = (char *) calloc (5, sizeof("uselist ") );
strcat(uselist, "uselist ");
strcat(uselist, my_string);
strcat(uselist, "\n");
write_imp3in(uselist);
free(uselist);
//loadlist to imp3sh
loadlist = (char *) calloc (1, sizeof("loadlist /music/") );
strcat(loadlist, "loadlist /music/");
strcat(loadlist, my_string);
strcat(loadlist,"\n");
write_imp3in(loadlist);
printf("loadlist %s\n", loadlist);
free(loadlist);
//repeat
write_imp3in("repeat\n");
} //end while
pclose(my_stream);
free(my_string); [color=Red]// SEGMENTATION FAULT[/color]
free(imp3sh_command); [color=Red]// SEGMENTATION FAULT[/color]
write_imp3in("djmode\n");
}
Alles anzeigen
Um Steuerbefehle über die named pipes zu schicken habe ich eine weitere Funktion names write_imp3in() geschrieben, die sieht so aus:
Die Steuerbefehle müssen immer mit \n abschließen
void write_imp3in(char *s) {
usleep(500*1000); //wait 500ms
//better learn how to use a semaphore
FILE *fd;
if ((fd = fopen("/tmp/imp3in","w")) == NULL) {
printf("\t---> Unable to open playlist file \n");
cfont631_write_xy(1,1, "Unable to open playlist file");
}
fprintf(fd, s);
fclose(fd); // file has to be closed
Alles anzeigen
Kann mir jemand weiterhelfen?
xxfunkxx