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 ... 12
1
OpenBar / Saluti da un vecchio utente :D
« il: 13 Aprile 2023, 17:32:05 »
Ciao ragazzi. E' da molto che non mi faccio vivo ed oggi mi e' tornato in mente gambas e la sua piacevole comunita' italiana.

Per i fatti della vita, ho cambiato lavoro ed ora mi trovo (piu' o meno) costretto a lavorare in ambiente windows/java .... e gambas e' riamsto un po' nel cassetto :-(

Tempo libero 0, ma prometto che il giorno che gambas verra' portato su windows o (piu' o meno con la stessa probabilita') riusciro' ad andare in pensione e programmare per diletto, mi rifaro' vivo con un po' di progetti pazzi :D

saluti

2
per diverse ragioni che non sto ad elencare, mi serve che un'applicazione gambas (audio_recorder.gambas) sia sempre in esecuzione, ma i metodi "standard" che cercano il PID dell'applicazione non funzionano, perche' in realta' l'applicativo gambas e' interpretato ed i pid restituiti sono quelli dell'inteprete "gbr3".

Il metodo che ho implementato in pratica conta le linee restituite dal comando "grep", che cerca su tutta la linea restituita da "ps".

Spero possa esservi utile:
Codice: [Seleziona]
#!/bin/bash

#beware 0 if not running, 1 if one is running, 2 or more if more are running

recorder_running=$(ps aux | grep gbr3 | grep recorder | wc -l);

# grep gbr3 estrae tutte le applicazioni interpretate da gambas3 runtime ...
# il grep successivo estrae quella specifica (in questo caso il recorder)

echo $recorder_running;

if [ "$recorder_running" -gt "0" ];
  then
    echo 'recorder is running ok';
    #agite di conseguenza
    else
      echo 'recorder is NOT running!';
      #agite di conseguenza
fi;

3
Programmazione / come fare outline di testo?
« il: 23 Dicembre 2020, 10:06:55 »
Salve, sto studiando il modo di poter sostituire un software che utilizziamo a lavoro e che gira su windows (ed al massimo XP), con una versione linux, piu' snella e personalizzabile.

scala infochannel designer 5:


Pero' una delle funzioni che utilizziamo di piu' e' tracciare un "outline" al testo (EVENTS nell'immagine qui sotto):


Cercando qualche info sul componente cairo, mi sono imbattuto in questa "guida", in tedesco, che sembra fatta abbastanza bene:
https://gambas-buch.de/dwen/doku.php?id=k25:k25.1:start

ma non riesco a trovare alcun accenno alla realizzazione di un "contorno" all'oggetto testo.

idee?

Grazie e buon natale :D

4
Mi scusino gli amministratori, ma non ho trovato la sezione adatta.
Mi chiedevo se c'e' in progetto di portare gambas su altre piattaforme (argh windows ....) :-(

5
Codice: [Seleziona]
If group = True Then
         GridView_Media.Row[i].Background = Color.LightGray
         Else
            GridView_Media.Row[i].Background = Color.Background
      Endif

errore:
non e' un oggetto dell'Fmain .....

mi accontenterei di cambiare il colore del font .....

6
Programmazione / Dialog.SelectDirectory() ignora filter
« il: 21 Aprile 2020, 16:00:52 »
in un pezzetto di codice utilizzo questa chimata al dialog per scegliere una directory.

Codice: [Seleziona]
Dialog.Filter = ["*.mpg;*.mpeg;*.mp4;*.mkv;*.avi;*.flv;*.mov;*.mts;*.webm", "video files"]
  If Not Dialog.SelectDirectory() Then
      Content("folder", Dialog.Path, "")
  Endif

La mia idea e' quella pero' di far vedere all'utente solo i file di tipo "video" nella directory scelta, ma in esecuzione ottengo il solo filtro "all files".

Capita anche a voi?

PS: gambas 3.14.3 su ubuntu 19.10

7
Altri linguaggi / mit app inventor 2 / Thunkable
« il: 30 Dicembre 2019, 13:23:18 »
Sto giocando in questi giorni con questi prodotti, molto carini, che permettono anche a chi non ha basi di programmazione, di poter realizzare semplici app per android.

Thunkable: https://thunkable.com
mitt app inventor2: http://Fai2.appinventor.mit.edu

E' veramente un peccato che non si possa utilizzare gambas per creare app android con una cross compilazione o altra tecnica di porting su android (o ios).

8
Altre piattaforme ARM / Lo smartphone per i programmatori Gambas
« il: 04 Ottobre 2019, 21:05:34 »
https://www.lffl.org/2019/10/ubuntu-touch-sbarca-sul-pinephone-pine64.html

Uno smartphone economico, ma con Ubuntu Touch :-)

Riusciremo a cros compilarci le nostre applicazioni gambas?

9
Programmazione / GSTREAMER errore troppi file aperti
« il: 13 Settembre 2019, 12:01:20 »
Salve a tutti, ho fatto un programma che registra in continuazione da una sorgente audio, comprime l'audio e ne fa pezzetti da un'ora per 90 giorni (poi cancello i file piu' vecchi).
Normalmente funziona per diverse settimane con un errore di "troppi file aperti".

Cercando su internet con gstreamer AND "too many files open" e' venuto fuori questo thread:
http://gstreamer-devel.966125.n4.nabble.com/Too-many-files-open-issue-td4687242.html

che mi sembra attinente.

Sembrerebbe che la semplice interruzione della pipeline, la sua distruzione e la sua riapertura NON siano sufficienti a FERMARE la registrazione.

Si deve inviare un EOS alla pipeline ed il codice C proposto e' questo:
Codice: [Seleziona]
void worker(GstElement *pipeline) {
    gst_element_send_event(pipeline, gst_event_new_eos());
}

void stopListening() {
    boost::thread *th = new boost::thread(worker,pipeline);
}

nel mio programma, che trovate qui':
https://sourceforge.net/projects/prsose/files/tools/PRS_recorder-0.0.10.tar.gz/

il codice che si occupa di chiudere la pipeline e generare un nuovo file e' questo:
Codice: [Seleziona]
Public Sub PipeLine(command As String)
Dim Destinazione As New String[]
Dim Risultato As String
Dim clienti As String[]
Dim I As Integer
 
  Select Case command
    Case "start"
      InitCaptureSystem
     
      InitSink
     
      muxer.LinkTo(sink)
     
      Try pl.Play
      If Error Then
        Message.Warning("Error starting gstreamer graph. Is Jack Audio server runnig?", "ok")
        ToggleButton_RecStop.Value = False
      Endif
     
      'riconnette al volo le sorgenti (se la cosa va gestita dall'applicazione e non dal sistema
      If AutoReconnectSource = True Then
        'non so perche' ma i client mi cambiano nome in modo progressivo .. quindi devo trovare quelli al momento validi per il mio programma
        'quindi scansiono i clienti di jack attivi (ho dato il play alla pipeline quindi c'e' anche il recorder) e mi trovo quelli con il nome
        'simile a quello che ho settato io in init_capture_system .... ovver "client_name" qualcosa
        Shell "jack_lsp" To Risultato
        clienti = Split(Risultato, gb.CrLf)
        For i = 0 To clienti.Count - 1
          If clienti[i] Like ("*" & clientname & "*") Then
            Destinazione.Add(clienti[i], Destinazione.Count)
          Endif
        Next
       
        'a questo punto dovrei avere uno o piu' sink del mio programma che ricevono l'audio dalla sorgente che ho indicato
        Shell "jack_connect " & Replace(FirstJackSource, " ", "\\ ") & " " & Destinazione[0]
        If StereoSource = True Then
          Shell "jack_connect " & GetNextOf(FirstJackSource) & " " & Destinazione[1]
        Endif
       
      Endif
     
      Timer_RecordClock.Start
    Case "stop"
      Try pl.stop
     
      Try Copy User.home & "/" & ClientName & ".ogg" To RealName
     
      Try pl.Close
     
      CheckForFilesToDelete
     
      Timer_RecordClock.Stop 
  End Select
 
End

mentre l'inizializzazione della pipeline si fa cosi' (nel mio programma):
Codice: [Seleziona]
Public Sub InitCaptureSystem()

  Try pl.Stop
  Try pl.close

  Try Recorder_Client.close
  Try audioformat.close
  Try audio_converter.close
  Try lev.close
  Try muxer.close
  Try que1.close
  Try que2.close
  Try que3.close
 
'in teoria dovrebbe funzionare:
'gst-launch-1.0 jackaudiosrc connect=0 client-name="test" ! audioconvert ! avenc_aac ! mp4mux ! filesink location=aac_audio.mp4

  pl = New MediaPipeline As "PipeLine"

  'dico a gstreamer che la sorgente audio e' una sorgente di jack-server
  Recorder_Client = New MediaControl(pl, "jackaudiosrc")
  Recorder_Client["client-name"] = ClientName

  Recorder_Client["connect"] = 0

  audioformat = New MediaFilter(pl, "audio/x-raw,channels=2")
  audio_converter = New MediaControl(pl, "audioconvert")
 
  'qui decidiamo il tipo di encoder
  Select Case encType
    Case "vorbis"
      encoder = New MediaControl(pl, "vorbisenc")
      encoder["name"] = "enc"
      encoder["quality"] = -0.1
    Case "opus"
      encoder = New MediaControl(pl, "opusenc") 'opusenc name=enc bitrate=24000 bitrate-type="vbr"
      encoder["name"] = "enc"
      encoder["bitrate"] = 24000
      encoder["bitrate-type"] = 2 '0=cbr 1=vbr  2=CONSTRAINED_VBR .. che penso sia vbr entro un certo bitrate
    Case "mp3"
      encoder = New MediaControl(pl, "lamemp3enc") 'opusenc name=enc bitrate=24000 bitrate-type="vbr"
      encoder["name"] = "enc"
      encoder["bitrate"] = 32
      encoder["cbr"] = False 'esempi lamemp3enc target=bitrate cbr=true bitrate=192 | lamemp3enc target=quality quality=0
  End Select
 
  lev = New MediaControl(pl, "level")
  lev["message"] = True

  muxer = New MediaControl(pl, "oggmux")
  que1 = New MediaControl(pl, "queue")
  que2 = New MediaControl(pl, "queue")
  que3 = New MediaControl(pl, "queue")

' Parte audio SENZA LIVELLI AUDIO:
  Recorder_Client.LinkTo(audioformat)
  audioformat.LinkTo(audio_converter)
  'audio_converter.LinkTo(encoder)
    'per cercare di estrarre i livelli dell'audio in ingresso invece:
    audio_converter.LinkTo(lev)
    lev.LinkTo(encoder)
  '
   encoder.LinkTo(muxer)
 
End


Public Sub InitSink()
'Dim sink As MediaControl

  Try sink.close

  'se si vuole registrare su file;
  sink = New MediaControl(pl, "filesink")
  'sarebbe da rendere parametrica la path
  sink["location"] = User.Home & "/" & ClientName & ".ogg"
  RealName = RecordingRoot & "/" & ClientName & "_" & Format(Now, "yyyy-mm-dd_hh-nn-ss") & ".ogg"
End

Da super scarsone di C, come faccio a mandare questo fatidico messaggio di EOS alla pipeline?

PS: in allegato l'ultima versione con qualche piccola modifica.

10
OpenBar / Un saluto!
« il: 30 Agosto 2019, 11:54:05 »
ciao ragazzi, un saluto post estate :D

mi dispiace di essere sparito, ma sono stato impegnato in altri progetti ed il lato programmazione l'ho lasciato un po' da parte :p

giuro che presto mi rimettero' al lavoro.

un abbraccio

Federico

11
Programmazione / analisi immagine statica
« il: 05 Giugno 2019, 12:21:10 »
dovendo fare una piccola applicazione che faccia una analisi di massima su una immagine (catturata dalla raspi-camera), mi chiedevo se convenisse:
A) gestire la visualizzazione dell'immagine e l'analisi del contenuto con le risorse interne di GAMBAS
B) utilizzare OpenCV e usare Gambas per il solo "report"

Opinioni?

PS: al momento si tratta di capire il "colore" dominante nell'immagine. No pattern recognition o analisi esoteriche.

12
Salve, ho scritto una procedura che dovrebbe mandare una serie di valori esadecimali ad una macchina attraverso la seriale rs232 ma ho il sospetto che stia mandando la interpretazione ASCII di quelle cifre.
Per esempio dovrebbe mandare l'esadecimale a5 30 00 11 1f , ma penso che mandi "a53000111f".
So che il cavo ed il collegamento funziona, perché con miniComm quando mando in esadecimale quei valori, la macchina remota mi risponde.

Ora sono a casa e non ho il codice, domani lo carico.

Ma non ho trovato alcuna informazione sul fatto che serial.send invii i dati del butteremo in un modo (ASCII) o nell'altro (esadecimale).

13
Progetti degli utenti / Video playlist player evoluto
« il: 17 Aprile 2019, 19:20:58 »
nato per mie esigenze lavorative, il player e' pensato per riprodurre in sequenza una serie di video e comandare device esterni via porta seriale, ma puo' essere esteso per molteplici usi.

Il device di uscita nel mio caso e' una scheda Black Magic Intensity pro, ma cambiando il comando gstreamer potete adattarlo a piu' situazioni (come per esempio una web - tv se uscite in rtsp :D)

tra' le varie feature evolute, la estione di log per errori ed eventi e l'invio di email ad un "amministratore" se qualcosa e' andato storto.

l'idea e' di aggiungere un server vnc per poter intervenire da remoto ;-)

14
Per VUOTT, se vuoi puoi integrare la WIKI con questo cosice (ho attinto all'esempio del midi modificandolo ai miei scopi):

Codice: [Seleziona]
' Gambas class file

Private video As Pointer

Private posizione As Long
Private durata As Long
Private dur As Date
Private pos As Date
Private OldPos As Date  'alle volte il video dura un tot ma il cirsore (pos) non raggiunge mai la fine anche se la riproduzione e' finita ... quindi conto piu' volte se pos=old_pos
Private threshold As Integer  'e questo controllo lo posso fallire al massimo per 3 tentativi
Const numero_massimo As Integer = 5

Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Const GST_FORMAT_TIME As Integer = 3
Private stato As Integer = GST_STATE_PLAYING

' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer

' gboolean gst_element_query_duration(GstElement *element, GstFormat format, gint64 *duration)
' Queries an element for the total stream duration in nanoseconds.
Private Extern gst_element_query_duration(gselement As Pointer, formatI As Integer, duration As Pointer) As Boolean
 
' gboolean gst_element_query_position (GstElement *element, GstFormat format, gint64 *cur)
' Queries an element for the stream position in nanoseconds.
Private Extern gst_element_query_position(gstelement As Pointer, gstformat As Pointer, cur As Pointer) As Boolean

' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)


Public Sub ToggleButton1_Click()
Dim fileVideo As String

  If ToggleButton1.Value = True Then
    fileVideo = Media.URL("/home/v1p3r/Video/unboxing e recensione scarpe trekking cinesi/pubblicita ufficiale aliexpress - cunge.mp4")
   
    ToggleButton1.Text = "STOP"
   
    Print fileVideo
   
    gst_init(0, 0)
   
    video = gst_parse_launch("uridecodebin uri=" & filevideo & " name=decode decode. ! interlace field-pattern=1 ! videoconvert ! video/x-raw,format=UYVY ! videoscale ! video/x-raw,width=720,height=576 ! videorate ! video/x-raw,framerate=25/1 ! autovideosink decode. ! audioconvert ! autoaudiosink", 0)
    'video = gst_parse_launch("uridecodebin uri=" & fileVideo & " name=decode decode. ! interlace field-pattern=1 ! videoconvert ! video/x-raw,format=UYVY ! videoscale ! video/x-raw,width=720,height=576 ! videorate ! video/x-raw,framerate=25/1 ! decklinkvideosink mode=3 decode. ! audioconvert ! decklinkaudiosink", 0)
 
  ' Avviamo la riproduzione del file Midi:
    gst_element_set_state(video, GST_STATE_PLAYING)
   
    threshold = numero_massimo 'il limite delle volte che il cursore di posizione puo' rimanere fermo (dopo si da per scontato che il video e' terminato)
    Timer1.Start
    Else
      ToggleButton1.Text = "PLAY"
      gst_element_set_state(video, GST_STATE_NULL)
 
      gst_object_unref(video)
  Endif

 

End

Public Sub Button1_Click()
 
 If ToggleButton1.Value = True Then
   Timer1.Stop
   ToggleButton1.Value = False
 Endif
 
End



Public Sub Timer1_Timer()

   If (posizione = 0) Or (durata > posizione) Then
      gst_element_query_duration(video, GST_FORMAT_TIME, VarPtr(durata))
      gst_element_query_position(video, GST_FORMAT_TIME, VarPtr(posizione))
      Print "\rDurata: " & Date(0, 0, 0, 0, 0, 0, durata / 1000000) & "      Pos. " & Date(0, 0, 0, 0, 0, 0, posizione / 1000000)
      Else
        Print "\rPlay Completato"
        ToggleButton1.Value = False
        Timer1.stop
   Endif
   
     'controllo se video terminato ma posizione non aggiornata
  If (posizione > 0) And (Date(0, 0, 0, 0, 0, 0, posizione / 1000000) = OldPos) Then
      If threshold = 0 Then
        Print "\rPlay Completato"
        ToggleButton1.Value = False
        Timer1.stop
        Else
          threshold = threshold - 1
      Endif
      Else
      OldPos = Date(0, 0, 0, 0, 0, 0, posizione / 1000000)
      threshold = numero_massimo
   Endif

End


PS: io esco su una scheda video particolare (intensity pro, ma va bene anche su decklink della black magic), commentando il "video = gst_parse_launch( ..." e levando il commento all'altro potrete usare un output standard.

15
per "mimare" con il componente gb.media il comportamento di questa pipeline funzionante (da shell):

Codice: [Seleziona]
gst-launch-1.0 uridecodebin uri=file:///home/v1p3r/video.mp4 name=decode decode. ! interlace field-pattern=1 ! videoconvert ! video/x-raw,format=UYVY ! videoscale ! video/x-raw,width=720,height=576 ! videorate ! video/x-raw,framerate=25/1 ! decklinkvideosink mode=3 decode. ! audioconvert ! decklinkaudiosink

ho pensato di usare questo codice (un inaspettato aiuto dal forum tedeco di gambas:https://www.gambas-club.de/viewtopic.php?t=5438):

Codice: [Seleziona]
' Gambas class file

'typedef enum
' {
'   GST_INTERLACE_PATTERN_1_1,
'   GST_INTERLACE_PATTERN_2_2,
'   GST_INTERLACE_PATTERN_2_3,
'   GST_INTERLACE_PATTERN_2_3_3_2,
'   GST_INTERLACE_PATTERN_EURO
' }GstInterlacePattern;

Public Sub ToggleButton1_Click()
Dim pl As MediaPipeline
Dim src As MediaControl
Dim interlace As MediaControl
Dim videoconvert, videoscale, videorate, audioconvert As MediaFilter
Dim videosnk, audiosnk As MediaControl

 
 pl = New MediaPipeline
 
 src = New MediaControl(pl, "uridecodebin")
 src["uri"] = "file:///home/v1p3r/video.mp4"

 interlace = New MediaControl(pl, "interlace")
 interlace["field-pattern"] = "0"
 
 videoconvert = New MediaFilter(pl, "video/x-raw,format=UYVY")
 
 videoscale = New MediaFilter(pl, "video/x-raw,width=720,height=576")
 
 videorate = New MediaFilter(pl, "video/x-raw,framerate=25/1")
 
 audioconvert = New MediaFilter(pl, "audio/x-raw,format=S16LE,channels=2")
 
 videosnk = New MediaControl(pl, "decklinkvideosink")
 videosnk["mode"] = 3
 
 audiosnk = New MediaControl(pl, "decklinkaudiosink")
 
 src.LinkLaterTo(interlace)
 interlace.LinkTo(videoconvert)
 videoconvert.LinkTo(videoscale)
 videoscale.LinkTo(videorate)
 videorate.LinkTo(videosnk)
 
 src.LinkLaterTo(audioconvert)
 audioconvert.LinkTo(audiosnk)

 
 pl.Play()
 
 ToggleButton1.Enabled = False
 
 While pl.Duration > pl.Position
   Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
   Wait 0.001
 Wend
 
 pl.Stop()
 pl.Close()

 ToggleButton1.Enabled = True

End

ma, come al solito, al pl.play() ottengo un misero "cannot set status" .....

idee?

Pagine: [1] 2 3 ... 12