Hallo,
wie kann ich folgenden Befehl "sudo ./FMSender/pifm sound.wav 100.00" in c ausführen
Hallo,
wie kann ich folgenden Befehl "sudo ./FMSender/pifm sound.wav 100.00" in c ausführen
Befehl ausführen wie?? Schau mal ob du hier fündig wirst!
Mit system() aber zu 99,999% sicher kann ich dir sagen, dass du das NICHT willst.
Es ist der FALSCHE Weg Aus C/C++ externe Befehle auszuführen. Das ist schon in PHP/Python/Ruby extrem schlechter Stil, und in C/C++ eine Todsünde. Es gibt nur wenige Ausnahmen, und einen Sound abspieln gehört nicht dazu, such lieber eine Bibliothek die das kann.
Prinzipiell stimme ich Horroreyes zu: eine Library ist meist besser.
Wenn's aber doch sein soll, dann system eher vermeiden !
Der bessere Weg ist fork() - exec() - wait().
Die Kombination braucht eine ausfuehrliche Erklaerung und die erste
die Google gefunden hat ist fork-exec tutorial
Ja ich weiß,
nur klappt irgendwie das einbinden der pifm.c nicht und dessen aufruf dann.
Deswegen so.
Wie Horroreyes schon erwähnte ist es eigentlich eine schlechte Idee, externe Programme auszuführen. Wenn möglich sollte man immer den nativen Weg gehen und es direkt in der jeweiligen Sprache umsetzen, auch wenn das aufwendiger umzusetzen ist oder länger dauert - es läuft dann nicht nur schneller sondern ist auch sauberer ... und man lernt auch noch was dabei
nur klappt irgendwie das einbinden der pifm.c nicht und dessen aufruf dann.
"irgendwie" ... da solltest du schon detailiertere Aussagen machen damit man dir überhaupt helfen kann
"irgendwie" ... da solltest du schon detailiertere Aussagen machen damit man dir überhaupt helfen kann
Ich werde es versuchen.
Wenn ich die pifm.c richtig verstanden habe ruft man die Funktion zum übertragen der Audiodatei mit void playWav(char* filename, float samplerate, bool stereo) auf (Z.524 bzw. 656).
Also habe ich diese in einen headerdatei gepackt und jeweils eingebunden.
Aufrufen tue ich die Funktion das so:
Allerdings kommt nun beim kompelieren immer folgender fehler:
main.c++:14:32: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Allerdings kann ich nicht erkennen was daran falsch sein soll
Zeile
Die Header Datei sieht so aus
#ifndef FMSENDER_H_INCLUDED
#define FMSENDER_H_INCLUDED
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <math.h>
#include <fcntl.h>
#include <assert.h>
#include <malloc.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
void playWav(char* filename, float samplerate, bool stereo);
#endif
Alles anzeigen
und das ist meine gesamte Main
#include <iostream>
#include "FMSender.h"
/*---- Hauptprogramm ----*/
using namespace std;
int main()
{
playWav("sound.wav", 100.00, 0);
return 0;
}
Alles anzeigen
im Anhang hab ich die pifm.c gepackt
Wenn ich die pifm.c richtig verstanden habe ruft man die Funktion zum übertragen der Audiodatei mit void playWav(char* filename, float samplerate, bool stereo) auf (Z.524 bzw. 656).
Hm, diese Zeilenangaben kann ich nicht reflektieren... Wir sprechen doch von dieser Datei oder -> https://github.com/rm-hull/pifm/blob/master/pifm.c
Die Header Datei sieht so ausC Alles anzeigen#ifndef FMSENDER_H_INCLUDED #define FMSENDER_H_INCLUDED #include <stdio.h> #include <string.h> #include <stdlib.h> #include <dirent.h> #include <math.h> #include <fcntl.h> #include <assert.h> #include <malloc.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include <signal.h> #include <unistd.h> void playWav(char* filename, float samplerate, bool stereo); #endif
*hust* Da fehlt aber irgendwie noch ne ganze Menge Code
Zeile 535: void playWav(char* filename, float samplerate, bool stereo)
das ist nur die definierung der Anweisung/Funktion, danach kommt dann aber überhaupt erst der eigentliche Code was diese Anweisung macht
void playWav(char* filename, float samplerate, bool stereo)
{
int fp= STDIN_FILENO;
if(filename[0]!='-') fp = open(filename, O_RDONLY);
char data[1024];
SampleSink* ss;
if (stereo) {
StereoModulator* sm = new StereoModulator(new RDSEncoder(new Outputter(152000)));
ss = new StereoSplitter(
// left
new PreEmp(samplerate, new Resamp(samplerate, 152000, sm->getChannel(0))),
// Right
new PreEmp(samplerate, new Resamp(samplerate, 152000, sm->getChannel(1)))
);
} else {
ss = new Mono(new PreEmp(samplerate, new Outputter(samplerate)));
}
for (int i=0; i<22; i++)
read(fp, &data, 2); // read past header
int readBytes;
while (readBytes = read(fp, &data, 1024)) {
ss->consume(data, readBytes);
}
close(fp);
}
Alles anzeigen
Aber nur diese Anweisung zu kopieren wird denk ich nicht reichen da in dieser Anweisung auch noch weiteres aus der pifm.c Datei aufgerufen wird wie zum Beispiel SampleSink oder StereoModulator usw
> main.c++:14:32: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Das ist bloss eine Warnung.
Es wird eine Konstante uebergeben, und der Parameter von playWav ist prinzipiell veraenderbar.
Erster Ansatz (korrekt und sauber): den Parameter von playWav auf const char * aendern.
Wenn das Probleme macht, die Funktion playWav kontrollieren ob sie die Parameter
tatsaechlich aendert, oder ob der Programmierer bloss zu faul war um sie richtig zu
deklarieren.
Wenn der Parameter NICHT geaendert wird, kann die Sache mit einem Typecast erledigt
werden: playWav( (char *)"sound.wav", 100.00, 0);
Wenn die Funktion die Parameter aendert, hilft das:
char file[] = "sound.wav" ;
playWav( file, 100.00, 0);
meigrafd
jep wir sprechen von dieser Datei
So hab das Programm trotz Warnung ausgeführt und es gibt ein Speicherzugriffsfeheler
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!