RaspberryPi debian wheezy: запуск приложения X из программы на C

Я пытаюсь написать программу, которая поможет читать текстовые и pdf-документы на C помощью программ с открытым исходным кодом на raspberry pi.

программа простая, ничего сложного.....

я подключаюсь к raspberry pi через ssh с моего ноутбука...Х проброс работает нормально, потому что я могу запускать X-приложения из командной строки без каких-либо проблем.

Я использую apache2 на raspberry pi, и я сделал пользовательский интерфейс для этой программы где вы можете вставить текст, загрузить текстовые файлы или pdf-файлы.

текст преобразуется в речь с помощью espeak, который сохраняет вывод в файл wave.

теперь проблема в том, что я использую:

system("xmms2 play file.wav &") в C код ........просто краткое описание

он компилирует.....когда я пытаюсь его с веб-страницы отображаются ошибки:

Gtk-WARNING **: cannot open display: localhost:10.0
cannot start xmms2d.....failed to start xmms2 server

Я даже попробовал другой аудиоплеер под названием aqualung, и он работал один раз, но на следующий день, когда я перезагрузить компьютер, это больше не работает.

Я Google вокруг и сделал все от export DISPLAY=:0.0 чтобы убедиться, что имя хоста на клиенте и хосте не localhost, но не успех

так что я думаю, может быть, есть что-то, что я не добавил в программу C, может быть, файл заголовка, который должен быть добавлен или что-то в этом роде.....Gtk + установлен на моей малине....

или, может быть, я не должен делать это как программа C, но делать все в bash или php....

если я использую проигрываю wav файл, получаю звуковой вывод, разница только в том, что мне нужно что-то с командной строкой и пользовательским интерфейсом. таким образом, я могу отправлять команды из программы, а также пользователь может приостановить и воспроизвести файл, когда захочет.

Pls некоторый совет необходим.... вот такой вот код

#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <wiringPi.h>   


char readcmd(void) //reading from text file /home/pi/cmdrdy.txt first character is read
{    //whenever text is received a 1 is written to this file, 2 for file received
    FILE *stream;
    int ch;
    if( (stream = fopen("/home/pi/txtrdy.txt", "r")) == NULL )
        return 0;
    ch = fgetc( stream );
    fclose( stream );
    return (ch-'0');
}


void  reset()
{
    FILE *ft;
    char ch;
    ft = fopen( "/home/pi/cmdrdy.txt", "w" );
    ch = '0';
    fprintf(ft, "%c", ch );
    fclose(ft);
}


void checktxt(){
    if(readcmd() == 1)
    {
        system("espeak -v en -f /home/pi/book.txt -w /home/pi/text.wav &");
        reset();  //to reset the text received flag to 0
        system("xmms2 play /home/pi/text.wav &");
    }

    if(readcmd2() == 2)
    {
        system("pdftotext -layout  /home/pi/upload/*.pdf  /home/pi/converted.txt &");
        delay(300);
        system("espeak -v en -f /home/pi/converted.txt -w /home/pi/book.wav &");
        delay(500);

        system("sudo rm /home/pi/converted.txt");
        system("sudo rm  /home/pi/upload/*.pdf");
        system("xmm2 play /home/pi/book.wav &");
    }
}

void main(){
    while(1){
        checktxt();
    }
}
17
задан user280026
03.03.2023 18:02 Количество просмотров материала 2681
Распечатать страницу

2 ответа

Я сам не сталкивался с этой проблемой, но я могу рискнуть сформировать обоснованное предположение относительно того, почему это происходит: судя по всему, xauth не распространяется на дочерний процесс. Фактически, я не смог найти XAUTHORITY в выводе

   export -p

малина работает Raspian.

Я не смог установить точно, самим погуглить вокруг, что это на самом деле даже для других ОС, но это так легко исправить, что стоит все равно попробуйте. Я предлагаю вам заменить команду исполняемым скриптом, вызвать его /home/my_name/bin / my_script, сделанным исполняемым с помощью chmod 755 конечно, в котором вы размещаете следующие 3 строки кода:

   #!/bin/bash
   export XAUTHORITY=/home/my_name/.Xauthority
   xmms2 play file.wav &

С system сначала вызовите forks, затем запустите экземпляр оболочки с переменными среды caller, ваша программа знает (и доказывает, что знает), что ваш дисплей 10.0, но доступ к нему должен быть предоставлен в ячейке, в которой команда xmms2 выполняется. Эта модификация гарантирует вам это.

4
отвечен MariusMatutiae 2023-03-05 01:50

Я немного изменил приведенный выше код и добавил в него советы

включить

включить

включить

включить

перечисление typedef {состояния WAIT, TEXT, PDF, DOC}; состояние char typedef; Состояние current_state;

Чаре readcmd() //чтение из текстового файла /Home/Пи/cmdrdy.читается первый символ txt { файловый поток; int ch; если( (поток = с помощью функции fopen("/Home/Пи/cmdrdy.txt", "r")) = = NULL ) возвращает 0; ch =fgetc (поток ); функции fclose( поток ); возврат (ch - '0'); }

void  reset()

{ Файл * ft; char ch; фут = с помощью функции fopen( "/Home/Пи/cmdrdy.txt", " w" ); ch = '0'; fprintf(футы, "%с", гл. ); fclose(ft); }

char convtts() {  //convert text to speech
system("espeak -v en -f /home/pi/book.txt -w /home/pi/text.wav &");
return (0);

}

char pdf2txt(){   //convert pdf to text
 system("pdftotext -layout  /usr/lib/cgi-bin/upload/*.pdf /home/pi/converted.txt");
return (0);

}

char pdftts(){ //convert converted text to speech
  system("espeak -v en -f /home/pi/converted.txt -w /home/pi/book.wav &");
return(0);

}

void state_machine(void){   //creating a state machine

switch(current_state){


case WAIT:


    if(readcmd() == 1)
    {
    reset();
current_state  =  TEXT;
    }

if(readcmd() == 2)
    {
 reset();
    current_state  =  PDF;
}
break;


case TEXT:

convtts();
while(convtts()==1);

system("/home/pi/bin/text_script");

current_state = WAIT;
break;


case PDF:

pdf2txt();
while(pdf2txt()==1);

pdftts();
while(pdftts()==1);
system("/home/pi/bin/book_script");
system("sudo rm /usr/lib/cgi-bin/upload/*.pdf");
current_state = WAIT;
break;

} }

void main(){

while(1){

state_machine();

} }

и это работает как шарм......спасибо

0
отвечен user280026 2023-03-05 04:07

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх