Autore Topic: [RISOLTO]Problema intercettazione output processo.  (Letto 2069 volte)

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
[RISOLTO]Problema intercettazione output processo.
« il: 12 Febbraio 2012, 18:03:14 »
Salve mi chiamo Vincenzo e da poco meno di due mesi ho abbandonato windows per passare a kubuntu.
In questo lasso di tempo ho potuto smanettare un poco con Gambas ed ho realizzato il porting di un frontend che avevo creato su vb net (GambNafen).
Visto il mancato supporto di UADE sulle ultime versioni di Audacious,  sto cercando di ultimare un'interfaccia grafica per UADE compatibile anche con Sidplay2 e Xmp .

Ho un paio di difficoltà che non sono riuscito a superare pur leggendo il vostro prezioso forum e le numerose ma scarse guide su Gambas presenti sulla rete.

- Vorrei visualizzare su una textarea l'output del processo di UADE (attualmente viene visualizzata qualcosa ma in modo molto parziale)
- Vorrei fare la stessa cosa con Xmp e Sidplay ma la cosa sembra essere particolarmente ostica vista la serie di caratteri in sequenza riportati dai rispettivi output
- Vorrei gestire l'output di Sidplay2 con EXEC e non con SHELL ma a quanto pare con Sidplay2 il passaggio di più di tre parametri non viene digerito correttamente da EXEC

Ringrazio tutti coloro che mi aiuteranno ;)

Allego sorgente del progetto (scusate non è molto leggibile e per nulla commentato)
« Ultima modifica: 15 Febbraio 2012, 00:05:47 da Speedvicio »

Online vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #1 il: 12 Febbraio 2012, 18:13:26 »
 :ciao: Sembra molto interessante.

Ti volevo segnalare che, dopo aver caricato un file (.mp3, o anche .wav) da ascoltare, quando vado a premere il tasto "play", mi viene restituito questo errore:

Null Object in FMain:102

alla riga:
If $hProcess.State = 0

della routine:
Public Sub Tempo1_Timer()
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #2 il: 12 Febbraio 2012, 18:19:10 »
Stai tentando di caricare file non supportati da quei player , supportano solo chiptune per intenderci file. mod, .sid e tutta quella musica elettronica famosa ai tempi del commodore Amiga , c64 e dos per capirci.
Comunque è strano non dovrebbe dare comunque quell'errore ora do un'occhiata... grazie per la segnalazione :)

Online vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #3 il: 12 Febbraio 2012, 18:24:46 »
Stai tentando di caricare file non supportati da quei player , supportano solo chiptune per intenderci file. mod, .sid e tutta quella musica elettronica famosa ai tempi del commodore Amiga , c64 e dos per capirci.

Capisco.
Potresti allora magari porre un filtro  ;) con

Dialog.Filter = ["*.xxx", "tipo di file", "*.yyy", "altro tipo di file", "*.etc....."]
per la finestra di dialogo "Choose a file to play" per selezionare i file. Quelli non previsti lì verranno esclusi.

Ho visto che hai posto: Dialog.Filter = ["*.*", "All files"]
ma così permetti il carico (al di là se supportati o meno) di tutti.
« Ultima modifica: 12 Febbraio 2012, 18:38:05 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #4 il: 12 Febbraio 2012, 18:31:09 »
Stai tentando di caricare file non supportati da quei player , supportano solo chiptune per intenderci file. mod, .sid e tutta quella musica elettronica famosa ai tempi del commodore Amiga , c64 e dos per capirci.

Capisco.
Potresti allora magari porre un filtro  ;) per la finestra di dialogo "Choose a file to play" per selezionare i file ed escludere quelli non supportati.

C'è già qualcosa del genere nel modulo che al momento non è abilitato per dei test che sto effettuando, il problema che escludere tutti i file non supportati è un casino, nel mio computer se tenti di riprodurre file non supportati esce un errore che ti comunica che quel tipo di file non è supportato.
A te spunta quell'errore perchè nessuno dei player richiesti da frontend è installato quindi il processo non parte (è null) e quindi il programma freeza.
Dovrei implementare un ulteriore controllo ai pid dei tre processi e se nessuno dei tre è attivo avvisare con un errore.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #5 il: 12 Febbraio 2012, 19:29:51 »
la cos amigliore sarebbe che allegassi un file sid, così possiamo fare delle prove.

cmq prova con qualcosa del genere

Codice: [Seleziona]
Public Sub screenplayer()
Dim stringa, risultato, subsong As String
  Dim righe As New String[]  
  Dim i As Integer
  
 'Exec ["uade123", "-g", song] To stringa
 'prova con questa riga
   hprocess = Shell "uade123 -g " & song For Read Write As "hprocess"
 'oppure con questa
 'hprocess = Shell "uade123 -g " & song For Input Output As "hprocess"
     If stringa = "" Then
      TextArea1.text = "Unknow format module"
      ami.Label9.text = "0"
      Return
    Else
   TextArea1.Clear
  Endif
  
  TextArea1.Clear
  righe = Split(stringa, "\n")  


For i = 0 To 3
  Try TextArea1.text = TextArea1.text & righe[i] & "\n"
  If Error Then Return
Next

If righe[3] = "" Then
subsong = righe[1]
Else
  subsong = righe[3]
  End If
  
subsong = Right(subsong, 18)
subsong = Trim(Replace(subsong, "(cur, min, max)", ""))
If Len(subsong) <= 2 Then
Ami.label7.text = subsong
Else
  ami.label7.text = "0"
End If

End

Public Sub hprocess_read()
  
  Dim sBuf As String

 
 
 
 
  If Lof(hprocess) Then
    Read #hprocess, sBuf, Lof(hprocess)
    TextArea1.Insert(sBuf)
  End If
  
End
ps ricordati di mettere in cima a tutto la dichiarazione

private hprocess as process
« Ultima modifica: 12 Febbraio 2012, 19:51:49 da fsurfing »

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #6 il: 12 Febbraio 2012, 19:56:33 »
la cos amigliore sarebbe che allegassi un file sid, così possiamo fare delle prove.

cmq prova con qualcosa del genere

Codice: [Seleziona]
Public Sub screenplayer()
Dim stringa, risultato, subsong As String
  Dim righe As New String[]  
  Dim i As Integer
  
 'Exec ["uade123", "-g", song] To stringa
 'prova con questa riga
   hprocess = Shell "uade123 -g " & song For Read Write As "hprocess"
 'oppure con questa
 'hprocess = Shell "uade123 -g " & song For Input Output As "hprocess"
     If stringa = "" Then
      TextArea1.text = "Unknow format module"
      ami.Label9.text = "0"
      Return
    Else
   TextArea1.Clear
  Endif
  
  TextArea1.Clear
  righe = Split(stringa, "\n")  


For i = 0 To 3
  Try TextArea1.text = TextArea1.text & righe[i] & "\n"
  If Error Then Return
Next

If righe[3] = "" Then
subsong = righe[1]
Else
  subsong = righe[3]
  End If
  
subsong = Right(subsong, 18)
subsong = Trim(Replace(subsong, "(cur, min, max)", ""))
If Len(subsong) <= 2 Then
Ami.label7.text = subsong
Else
  ami.label7.text = "0"
End If

End

Public Sub hprocess_read()
  
  Dim sBuf As String

 
 
 
 
  If Lof(hprocess) Then
    Read #hprocess, sBuf, Lof(hprocess)
    TextArea1.Insert(sBuf)
  End If
  
End

Intanto grazie per l'aiuto.
Ho testato la tua soluzione, avevo fatto in precedenza una prova del genere senza esiti positivi, comunque vi allego un paio di file per dei test.

questo è compatibile con uade e deve essere estratto in una cartella a piacimento:
http://files.exotica.org.uk/?file=exotica/media%2Faudio%2FUnExoticA%2FGame%2FHuelsbeck_Chris%2FTurrican_2.lha

questo con sidplayer:
http://hvsc.perff.dk/MUSICIANS/T/Tel_Jeroen/Noisy_Pillars.sid

@fsurfing il tuo codice è corretto ma credo faccia la stessa cosa di quello che avevo implementato io:

Codice: [Seleziona]
Public Sub Process_Read()  
Dim sLine As String
Dim sottoS As String[]
Dim i As Integer
   
   
 Try Read #$hProcess, sLine, -256
   
  label2.text &= sLine & gb.newline 
End 

Tutto sommato l'output che ne deriva potrebbe anche andar bene, il problema principale è ottenere un risultato simile anche con sidplay2 e xmp
« Ultima modifica: 12 Febbraio 2012, 20:31:26 da Speedvicio »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #7 il: 13 Febbraio 2012, 19:38:38 »
giusto per semplificare ho fatto delle prove con sidplayer

ti allego un sorgente, metti il file  Noisy_Pillars.sid nella tua home e vedi se ti può essere utile qualcosa:

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #8 il: 13 Febbraio 2012, 20:19:24 »
giusto per semplificare ho fatto delle prove con sidplayer

ti allego un sorgente, metti il file  Noisy_Pillars.sid nella tua home e vedi se ti può essere utile qualcosa:

Ti ringrazio tanto per il sorgente, questa soluzione va bene, dovrei solamente estrapolarmi i dati relativi ai dettagli della canzone (nome, tipo modulo, autore etc) e metterli nella text area, mentre nella label andrebbe il dettaglio relativo alla riproduzione della canzone.

Con xmp è semplice perchè prevede un parametro che visualizza tali valori, con sidplay è un pò più incasinato, ora vedo se riesco a smanettarci un poco.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #9 il: 13 Febbraio 2012, 21:00:36 »
Citazione
on xmp è semplice perchè prevede un parametro che visualizza tali valori, con sidplay è un pò più incasinato, ora vedo se riesco a smanettarci un poco.

questa può essere una soluzione :

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #10 il: 13 Febbraio 2012, 23:59:12 »
Grazie ancora per il tuo interessamento e per il tempo che stai perdendo nel tentativo di aiutarmi
Ho implementato il tuo codice sul sidplayer, non aggiorna le variabili al cambio della canzone nonostante venga killato il processo e la lettura del tempo trascorso varia al 50' secondo.

Allego nuovamente il sorgente aggiornato con il controllo iniziale sui player installati e le modifiche implementate sul sidplay "taroccando di sana pianta" il codice di fsurfing.

Se volete testare uade esiste un backport messo a disposizione da Morgoth per distribuzioni Ubuntu a questo indirizzo:

http://morgoth.free.fr/ubports/

Sidplay e Xmp sono disponibili già nel gestore di pacchetti.

 

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #11 il: 14 Febbraio 2012, 12:35:09 »
dovresti risolvere semplicemente portando la variabile tradotto a false quando avvii la canzone , in questo modo viene eseguito il codice di lettura dei titoli.

ps a me il sorgente non funziona, io fossi in te la parte relativa lla lettura del processo la lascere in CO e non in fmain

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #12 il: 14 Febbraio 2012, 13:35:25 »
dovresti risolvere semplicemente portando la variabile tradotto a false quando avvii la canzone , in questo modo viene eseguito il codice di lettura dei titoli.

ps a me il sorgente non funziona, io fossi in te la parte relativa lla lettura del processo la lascere in CO e non in fmain

E' la prima prova che ho fatto e purtroppo non produce risultati, probabilmente perchè la lettura del processo è gestita da un timer.

In che senso il sorgente non funziona?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #13 il: 14 Febbraio 2012, 20:18:28 »
appena faccio partire un file sid , il programam si blocca alla riga 128 di fmain con il messaggio :" descrittore di file errato"

io non vedo proprio il motivo di usare un timer per leggewre un processo, genera molti problemi,

leggi il processo con nome_processo_read()

se devi fare qualcosa quando termina usa   nome_processo_Finished()

Offline Speedvicio

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Problema intercettazione output processo.
« Risposta #14 il: 14 Febbraio 2012, 21:38:03 »
Ho seguito il tuo consiglio ed ho eliminato il timer, ho modificato in modo molto "grezzo" il tuo codice per la parte relativa a UADE  in modo da fargli leggere correttamente il tempo trascorso.
Il sidplayer invece presenta sempre lo stesso problema nell'aggiornamento dei dettagli del brano e nella visualizzazione del tempo trascorso, pur settando la variabile 'tradotto' su false (l'ho messa nella sub ver_modulo che è quella che parte ad ogni variazione di brano).

Allego codice "spero" funzionante.


Ho risolto quasi tutti i problemi.

Ringrazio per la pazienza e per l'aiuto ricevuto, in particolar modo a te fsurfing, sei stato molto paziente e sopratutto di grandissimo aiuto senza di te non avrei tratto un ragno dal buco.  :ciao:
« Ultima modifica: 15 Febbraio 2012, 00:12:26 da Speedvicio »