Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Topics - allegfede

Pagine: 1 2 [3] 4 5 ... 12
31
Non e' la prima volta che affrontiamo l'argomento, ma devo dire che ogni volta la soluzione 'e sempre un escamotage.

Quando lanciate un comando shell, di solito, ottenete lo standard output nella finestra "console" di gambas.

Ora la mia esigenza e' intercettare questo output e agire di conseguenza ....

Nello specifico il comando che lancio e':
Codice: [Seleziona]
Shell "melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 \x22" & Path & "\x22" For Write As "Osserva"

con:
Codice: [Seleziona]
Public Sub Osserva_Read()

  Dim sLine As String

  Read #Last, sLine, -256

  Debug sLine

End

Public Sub Osserva_Write()
 
  Debug "-osserva-"
 
End

che non danno segni di vita (il processo lanciato nella shell gira in background ....)

notare che se invece il comando che lancio e':
Codice: [Seleziona]
Shell "melt -profile dv_pal -timings -consumer decklink:0 terminate_on_pause=1 \x22" & Path & "\x22" For Read As "Osserva"

la riproduzione del video (melt e' un player video) non parte proprio ...

PS: la cosa interessante e' che usando il comando:
Codice: [Seleziona]
dmesg -wH
questo comando guarda a partire dalla coda gli eventi del vostro sistema (quindi magari mettete e smontate chiavette per avere degli eventi ....)

il ritorno c'e l'ho .... e' come se melt uscisse su un'altra console ... e' possibile?

32
Programmazione / Creare una nuova tab come copia di una vecchia
« il: 09 Marzo 2018, 19:09:16 »
parafrasando il thread precedente (http://www.gambas-it.org/smf/index.php?topic=6146.0), io invece vi chiedo:
"c'e' un metodo efficiente ed elegante per clonare una tab da un "modello" prerealizzato nell'ide?"

tipo:
tab.count=tab.count+1
For each object in tab(0)
 object.load(tab(tab.count+1))
next

?????

33
Programmazione / costruire un testo da dati in DB con eleganza
« il: 09 Marzo 2018, 18:42:56 »
CDT devo fare il file di configurazione di un programma linux (un demone ceh viene avviato all'avvio del computer), prendendo i parametri da un database.

C'e' un modo elegante per generare file di testo che non siano la pur efficente generazione riga per riga dello stesso?

Classi parser di qualche tipo che possano essere "istruite"? SED?

molto generico capisco .....

34
Salve a tutti.
Ho una applicazione che codifica dei dati (audio) e li invia ad un altro pc su una specifica porta (la 9000 per esempio).

Sull'altro PC un'altra applicazione prende i dati e li gestisce in un certo modo.
Non posso mettere mano alla seconda applicazione, ma posso intercettare i pacchetti cosi':
Codice: [Seleziona]
sudo tcpdump -i any -v -n dst port 9000

Pero' ho solo delle informazioni di massima, volendo analizzare il CONTENUTO dei pacchetti dovrei fare una cosa cosi':
Codice: [Seleziona]
sudo tcpdump -i any -v -n dst port 9000 -w capture.cap

che pero' a lungo andare mi crea un file gigantesco.

Secondo voi posso fare un file FIFO e con una applicazione Gambas andare ad analizzare questo file?

Oppure esiste la possibilita' di gestire lo sniffing della rete direttamente dai componenti gambas?

potrei anche fare cosi':
Codice: [Seleziona]
'dati DENTRO il pacchetto in partenza verso la porta 9000:
sudo tcpdump -i any  -x -s 0 'dst port 9000'

'oppure per quelli in arrivo alla porta 9000:
sudo tcpdump -i any  -x -s 0 'src port 9000'

35
Programmazione / incorporare script python in app gambas
« il: 27 Novembre 2017, 19:06:17 »
vorrei poter fare quel che fa questo script in python: https://github.com/kevmitch/mpv-autocrop

in una app gambas.

Mi traduco l'intero script (sempre che non sia esoterico) o posso incorporare il codice in gambas e lanciarlo arbitrariamente?

PS: quello script analizza un pezzo di file video, identifica le barre nere e restituisce il rettangolo di "ritaglio"

36
salve e bun giorno.

mi potreste testare questo codice?

Codice: [Seleziona]
Dim vConnessione As New Connection
Dim vPercorso As String ' variabile per il percorso in cui creare il db
Dim vDatabase As String ' variabile per il nome che diamo al database
Dim vTabella As Table
Dim vTabellaUno As String ' variabile per la creazione della tabella UNO e dei campi
Dim vRisultato As Result

  Dialog.Path = Settings["LastPlaylistFile", User.Home] & "Playlist_" & Format(Now, "yyyymmdd_hhnnss") & ".sqlite3"
 
  Dialog.Filter = ["*.sqlite;*.sqlite3", "sqlite format database files"]
  If Dialog.SaveFile() Then
    Return
  Endif

  'se siamo qui' allora abbiamo deciso di creare un nuovo file per la playlist

  If File.Ext(Dialog.Path) = "" Then
    Dialog.Path = Dialog.Path & ".sqlite3"
  Endif

  vPercorso = File.Dir(Dialog.Path) ' definisce il percorso del database
  vDatabase = File.Name(Dialog.Path) ' definisce il nome del database
 
  vTabellaUno = "CREATE TABLE 'PlaylistContent'" & ' nome della tabella e dei campi che si andrà a creare
                          "('id' INTEGER PRIMARY KEY," & ' chiave primaria
                          "'Time' VARCHAR(8) Default Null," &         'nome del campo, tipo e valore predefinito
                          "'Path' VARCHAR(55) Default Null," &
                          "'MediaType' VARCHAR(20) Default Null," &   'STATUS e' una proprieta' locale che viene definita al caricamento
                          "'lenght' VARCHAR(20) Default Null," &
                          "'WARN' VARCHAR(55) Default Null);"          'MEDIA e' una proprieta' locale che viene definita al caricamento
 
  If Exist(Dialog.Path) Then ' esiste il file della playlist, chiedo se cancellarlo o meno
    Select Case Message.Question("Do you want to overwrite playlist file?", "YES", "NO", "CANCEL")
        Case 2
          Return
        Case 3 'in ogni altro caso esco dalla procedura (verificare se devo comunque riscrivere STOP
          Return
      End Select
  End If
 
  'se siamo qui' vogliamo scrivere il file della playlist
 
  With vConnessione
  .Type = "sqlite3" ' indicazione del tipo di database da utilizzare
  .Host = vPercorso
  .Login = ""
  .Password = ""
  End With
 
  vConnessione.Open() ' apre la connessione
  If Not vConnessione.Databases.Exist(vDatabase) Then ' verifica che il db non esista già
  vConnessione.Databases.Add(vDatabase) ' crea il database
  vConnessione.Close() ' chiude la connessione

fino a pochi giorni fa mi funzionava .. ora non riesce a creare il database .....

37
Programmazione / [RISOLTO] trovare la cover art di un brano
« il: 15 Novembre 2017, 17:45:57 »
salve a tutti.

Come forse sapete sto' portando avanti il progetto di una regia radiofonica automatica completamente open source e il prototipo sta' gia' girando da un paio di mesi senza grossi problemi (PRS personal radio station su source forge).

Il sottosistema audio e' jack e utilizzando questo posso avere il segnale d'uscita che viene inviato sulla LAN dal pc di play, catturato da un raspberry pi2 e trasformato in un segnale adatto ad essere inviato ai trasmettitori FM (con RDS e stereo elaborati vi software in tempo reale dal PI).

Sempre con Jack, sono riuscito a passare il segnale d'uscita della mia regia automatica a due encoder:
darkice per lo streaming su internet (ogg vorbis 48kbps)
odr-dab enc per fornire l'audio ad un multiplex DAB (radio digitale via etere) speriementale.

La cosa divertente e' che posso fornire (il software e' mio, posso mandare i dati dove voglio :D) sia all'RDS (della vecchia FM) sia all'encoder DAB, il nome della canzone e l'autore/esecutore del brano (o se e' in onda il radio giornale o altri metadati) e questi vengono riprodotti dalle autoradio opportunamente capaci.

Ora pero' volevo mandare ANCHE la cover art (la copertina) del brano che si sta' ascoltando (od una grafica opportuna per le news, logo del programma, etc.) ma ho un problema.

COME TROVARE la copertina del brano?

So che e' possibile fare una cosa del genere:
eyeD3 --write-images=DIR mp3_file

ma spesso i file mp3 o altro formato NON hanno la copertina.

Pensavo di appoggiarmi a google images o meglio ad un servizio come questo:
https://coverartarchive.org/
https://archive.org/details/coverartarchive

C'e' qualcuno che ha voglia di sbattersi a fare un modulo che da "artista","album" estragga l'immagine e la sbatta da qualche parte?

per esempio ho visto che cercando la cover degli iron maiden (album powerslave) la stringa che il browser passa al server e':
https://archive.org/details/coverartarchive?and[]=iron%20maiden%20powerslave&and[]=mediatype%3A%22image%22

pero' ritorna una pagina dei risultati ed andrebbe estratta una delle immagini .... e sinceramente la parte web non mi piace per nulla ....

PS:stavo anche pensando che, essendo il recover delle imamgini un processo lento, farlo ogni volta che si manda in play un brano non ha senso ... sarebbe meglio fare un comando da lanciare batch e fargli aggiungere le cover a tutti i brani nel DB (ma a questo ci potrei pensare io).

Detto questo, vi manterro' informati sull'evoluzione del progetto :D

38
Programmazione / maschera binaria per stringa
« il: 23 Ottobre 2017, 18:52:02 »
stringa completa: "DLMMGVSD"

Codice: [Seleziona]
Dim GiorniSettimana As String = "DLMMGVSD"

stringa di confronto: "0101010":

Codice: [Seleziona]
Settimana = Format(Bin(Ritorno), "0000000")

dove:

Codice: [Seleziona]
 Public Sub Button_OK_Click()
Dim Valore As Integer
Dim I As Integer

  For i = 0 To ValiditaGiornaliera.Count - 1
    If ValiditaGiornaliera[i].Value = True Then
      valore = valore + 2 ^ (6 - i)
    Endif
  Next

  Form_InputGiorniSettimana.Close(valore)

End

vorrei ottenere: "_L_M_V_D"

ovvero rimpiazzare nella stringa "DLMMGVSD" un underscore solo se nella stringa di controllo ("0101010") e' presente uno 0.

idee geniali?

39
Segnalazione bug / FileChooser non genera eventi
« il: 04 Ottobre 2017, 18:47:06 »
Codice: [Seleziona]
Public Sub FileChooser1_DblClick()

  Debug "ciao"

End

Public Sub FileChooser1_MouseDown()

  Debug "mouse"

End

non viene mai scritto nulla in consolle ....

versione gambas 3.10.0 - su ubuntu 17.04

40
Programmazione / Spostare un form senza barra
« il: 03 Ottobre 2017, 19:09:27 »
CDT come faccio a spostare un form sullo schermo se gli ho tolto la barra del titolo?

ebbene si mi serve senza barra :D

41
In allegato il mio progetto per un registratore "di legge" per sorgenti audio gestite da un server jack.
Mi serve per poter registrare un log di quel che si sente/suona/dice in radio.
i file devono essere spezzati ogni ora (allo scoccare dell'ora) e verranno cancellati dopo tot giorni (normalmente 90).

Per ora il codec mp3 e' fake (ovvero non implementato), mentre il codec opus su macchine recenti funziona bene, mentre su altre da un errore su uno switch dell'encoder (forse una vecchia implementazione di "bitrate-type").

ps: Necessario jack audio server in esecuzione e gstreamer1 con i suoi plug in.

PPS: configurando qtjack inmodo opportuno si puo' fare in modo che la sorgente scelta venga connessa in automatico quando il programma inizia a registrare.

42
In allegato il mio progetto per un registratore "di legge" per sorgenti audio gestite da un server jack.
Mi serve per poter registrare un log di quel che si sente/suona/dice in radio.
i file devono essere spezzati ogni ora (allo scoccare dell'ora).

Pero' mi succede una cosa strana. ogni volta che stoppo il recorder e poi lo riavvio, mi crea il nuovo file, col nuovo nome (che comprende l'orario di inizio registrazione), ma mi azzera il contenuto del vecchio .....

ipotesi?

ps: Necessario jack audio server in esecuzione e gstreamer1 con i suoi plug in

44
Sto cercando di realizzare un vumeter "fisico" per piattaforma raspberry per dare un feedback visuale agli utilizzatori del device embedded.
Quindi l'idea e' leggere l'intensita' del segnale in ingresso dal line in di una scheda audio usb e visualizzare su un piccolo schermo lcd una barra che riproduca l'intensita' del segnale.

Dai vari suggerimenti e link scaturiti da questa discussione: http://www.gambas-it.org/smf/index.php?topic=5807.0

ho derivato un piccolo programma "console" che visualizza una barra sul terminale in base al volume di un segnale audio.

si lancia con (per esempio):
programmazione/DAB/pialsameter/pialsameter.gambas default

in allegato il codice completo:
Codice: [Seleziona]
' Gambas module file

Private Const SIZE As Long = 512

Private $bStop As Boolean
Private hVol As Float

Library "libasound:2"

Private Const SND_PCM_STREAM_CAPTURE As Byte = 1
Private Const SND_PCM_FORMAT_S16_LE As Byte = 2
Private Const SND_PCM_ACCESS_RW_INTERLEAVED As Byte = 3

' int snd_pcm_open(snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode)
Private Extern snd_pcm_open(pcm As Pointer, name As String, streamInt As Integer, mode As Integer) As Integer

' int snd_pcm_set_params(snd_pcm_t * pcm, snd_pcm_format_t format, snd_pcm_access_t access, unsigned int channels, unsigned int rate, int soft_resample, unsigned Int latency)
Private Extern snd_pcm_set_params(pcm As Pointer, _format As Integer, _access As Integer, channels As Integer, rate As Integer, soft_resample As Integer, latency As Integer) As Integer

' snd_pcm_sframes_t snd_pcm_readi (snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size)
Private Extern snd_pcm_readi(pcm As Pointer, buffer As Pointer, size As Long) As Long

' const char * snd_strerror (int errnum)
Private Extern snd_strerror(errnum As Integer) As String
   
' snd_pcm_close(snd_pcm_t *pcm)
Private Extern snd_pcm_close(pcm As Pointer)

Public Sub Main()
Dim deviceName As String
Dim handle As Pointer
Dim err, fc, channel, iVol, i As Integer
Dim buffer As New Short[SIZE]

 
  If Application.Args.Count < 2 Then
    Print "You must provide a sound device name"
    Return
  Endif
 
  deviceName = Application.Args[1]
 
  'ora la parte che legge i valori di alsa
 
  ' frequenza di campionamento (meglio sarebbe 48000)
   fc = 44100

   ' Festlegen der Kanalanzahl (1=mono, 2=stereo)
   channel = 2

   ' Registrieren von ALSA zur Aufnahme
   err = snd_pcm_open(VarPtr(handle), deviceName, SND_PCM_STREAM_CAPTURE, 0)
   If err < 0 Then Error.Raise("Fehler beim Öffnen des PCM Subsystems: " & snd_strerror(err))

   ' Einstellen der ALSA PCM Parameter
   err = snd_pcm_set_params(handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, channel, fc, 1, 0)
   If err < 0 Then Error.Raise("Fehler beim Einstellen der PCM Parameter: " & snd_strerror(err))

   $bStop = True

   While $bStop   ' läuft bis 'Stop' gedrückt wird 
 
     ' Übernahme der Daten in das abuffer-Array
     err = snd_pcm_readi(handle, buffer.Data, SIZE / 2)
     If err < 0 Then Error.Raise("Fehler bei der Audiodatenaufzeichnung " & snd_strerror(err))
 
     ' Berechnung der Summe der Volume-Werte
     For i = 0 To SIZE - 1
        iVol += CInt(buffer[i] * buffer[i])
        'iVol += CInt(buffer[i])
     Next
 
    'ivol = Abs(ivol)  'non so perche' possa venire un quadrato negativo
   
     'hVol = iVol * 5
     Try hVol = Sqr(iVol / SIZE)
     
     'Print hvol * 0.43
 
     RenderVolume 'hvol is the parameter
     
     iVol = 0
 
  ' 1 ms Warten, um Programmeingaben vornehmen zu können
     Wait 0.004
   Wend
   
   If $bStop = False Then snd_pcm_close(handle)
   buffer.Clear()


End

Public Sub RenderVolume()
Dim volume As String
Dim i As Integer
Dim Max As Integer

  Select Case hvol
    Case 0
      Print "tassenza segnale"
    Case Else
      'print hvol
      max = CInt(100 - hvol) \ 2
      ' max = CInt(Log10(100 - hvol))
      For i = 1 To max
        volume = volume & "#"
      Next
      Print volume
  End Select
 
  If hvol > 100 Then
    Print "ALTO!!!"
  Endif
 
End


Ora la domanda e': come si fa  a scrivere sempre sulla stessa riga della console (invece di far srivere una riga sotto l'altro)?

Domanda due (e qui e' dove ho abbandonato): come faccio ad avere il LEFT e RIGHT in due indicatori separati?

PS: ora devo interfacciare il gpio ......

45
Altri linguaggi / Da un long derivare i due short (c)
« il: 21 Luglio 2017, 23:37:17 »
In questo codice il programmatore prende un segnale mono (il device default di alsa) e ne legge il valore per visualizzarlo a schermo.
https://github.com/johnliu55tw/ALSASoundMeter

Ora io dovrei farme una versione stereo, che banalmente farei raddoppiando buffer in buffer_l e buffer_r, aggiungendo un buffer_totale che è non più short, ma long

Long buffer_totale[2*8*1024];

Cambiando la procedura di 'setup' della lettura di alsa da:

err = snd_pcm_set_params(handle_capture,
                             SND_PCM_FORMAT_S16_LE,
                             SND_PCM_ACCESS_RW_INTERLEAVED,
                             1,
                             48000,
                             1,
                             500000);

In:

err = snd_pcm_set_params(handle_capture,
                             SND_PCM_FORMAT_S16_LE,
                             SND_PCM_ACCESS_RW_INTERLEAVED,
                             2,
                             48000,
                             1,
                             500000);

Ma ora non so come assegnare i primi 8 bit di buffer_totale a buffer_l e gli ultimi 8 a buffer_r

......

Quanti ricordi... Svaniti....

Pagine: 1 2 [3] 4 5 ... 12