RaspberryPi debian wheezy: Execute o aplicativo X a partir de um programa em C

0

Estou tentando escrever um programa que ajude a ler documentos em texto e pdf em C usando programas de código aberto no pi do framboesa.

o programa é simples, nada complicado .....

Estou conectando ao raspberry pi através do ssh do meu laptop ... O encaminhamento do X está funcionando bem, pois posso iniciar aplicativos X a partir da linha de comando sem problemas.

Estou usando o apache2 no raspberry pi e criei uma interface de usuário para este programa, onde você pode colar texto, enviar arquivos de texto ou arquivos pdf.

O texto é convertido em fala com o espeak, que salva a saída em um arquivo wave.

Agora, o problema é que eu uso:

system("xmms2 play file.wav &") no código C ........ apenas uma breve descrição

ele compila ..... quando eu tento da página da web ele exibe erros:

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

Eu até tentei outro player de áudio chamado aqualung e funcionou uma vez, mas no dia seguinte, quando reiniciei o computador, ele não funciona mais.

Eu pesquisei e fiz de tudo, desde export DISPLAY=:0.0 até ter certeza de que o nome do host no cliente e no host não é localhost mas não teve sucesso

Então eu acho que talvez haja algo que eu não adicionei no programa C, talvez um arquivo de cabeçalho que precise ser adicionado ou algo assim ..... O Gtk + está instalado no meu framboesa ....

Ou talvez eu não deva fazer isso como um programa em C, mas faço tudo em bash ou php ....

se eu uso aplay para reproduzir o arquivo wav, eu recebo saída de som, a única diferença que eu preciso de algo com a linha de comando e interface do usuário. então eu posso enviar comandos do programa e também o usuário pode pausar e reproduzir o arquivo sempre que ele quiser.

Pls alguns conselhos são necessários .... aqui é o código

#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();
    }
}
    
por user280026 07.12.2013 / 18:00

2 respostas

4
Não pude me deparar com esse problema, mas posso me aventurar a adivinhar de que isso está acontecendo: pelo que parece, o xauth não se estende ao processo infantil. Na verdade, não consegui localizar XAUTHORITY na saída de

   export -p

em uma framboesa correndo Raspian.

Eu não consegui estabelecer com certeza, pesquisando ao redor, que este é realmente o caso mesmo para outros sistemas operacionais, mas é tão fácil tentar consertar isso, que vale a pena tentar de qualquer maneira. Sugiro que você substitua o comando por um script executável, chame-o / home / my_name / bin / my_script, tornando executável por meio de chmod 755 , é claro, no qual você coloca as seguintes 3 linhas de código:

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

Como os primeiros forks de chamada system iniciam uma instância do shell com as variáveis de ambiente do chamador, seu programa sabe (e prova que sabe) que sua exibição é 10.0 , mas o acesso a ela deve ser concedido dentro de o subshell no qual o comando xmms2 é executado. Esta modificação garante isso.

    
por 08.12.2013 / 11:26
0

Eu modifiquei o código acima um pouco agora e adicionei o conselho a ele

incluir

incluir

incluir

incluir

typedef enum {ESPERA, TEXTO, PDF, DOC} ESTADOS; typedef char STATE; STATE current_state;

char readcmd () // leitura do arquivo de texto /home/pi/cmdrdy.txt o primeiro caractere é lido     {     FILE * stream;     int ch;     if ((stream = fopen ("/ home / pi / cmdrdy.txt", "r")) == NULL)     return 0;     ch = fgetc (fluxo);     fclose (fluxo);     retorno (ch-'0 '); }

void  reset()

{     ARQUIVO * ft;         char ch;         ft = fopen ("/home/pi/cmdrdy.txt", "w");         ch = '0';         fprintf (ft, "% c", ch);         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();

}

E funciona como charme ...... graças a um milhão

    
por 11.12.2013 / 11:12