b9b46f3873
* NEW: Add "-march=native" to the compilation flags. Maybe it could speed up then interpretrer a bit? [DEVELOPMENT ENVIRONMENT] * NEW: Connection editor: Update layout. * NEW: Form editor: Clicking on the master selection selects the parent control. [WEB SITE MAKER] * NEW: Update for 3.8.4 version. [GB.DB] * BUG: Default values are now correctly taken into account by database templates. [GB.DB.SQLITE3] * BUG: Fix a possible uninitialized allocation of columns names. [GB.UTIL] * NEW: Class.Stat() class name argument now allows "../" in the name to search for classes in parent components. [GB.WEB] * NEW: Request.Language returns the main language requested by the HTTP client. This value can be directly assigned to System.Language. * NEW: Session.Size returns the size of the session file in bytes. [GB.WEB.FORM] * NEW: Automatic management of favicon. The application favicon must be a file named "favicon.png" in the ".public" directory. * NEW: The Align class for alignment constants. * NEW: WebControl: Any control can raise a Message event now. * NEW: The Message boxes now raise the "Message" event of the WebControl that opened the message box. If the event is not handled, then the event is raised by the WebForm of the control. * NEW: The Select class for selection mode constants. * BUG: WebComboBox: Define the default event. * NEW: WebContainer: Indent is a new property that allows to add a left padding to the container. * NEW: WebContainer: Extra children (those created after initialization) are now recreated with their event observer and event name, provided that the event observer is another WebControl. * NEW: WebContainer: DeleteChildren() is a new method that deletes all container children. * NEW: WebExpander: New container that implements an expander. * NEW: WebForm: Teh application language now automatically switches to the language requested by the HTTP client. * BUG: WebForm: Show() and ShowModal() method now raise the Open event. * NEW: WebLabel: Add the Border property to the property list. * NEW: WebLabel: Newlines in label text are automatically replaced by "<br>". * NEW: WebTable: New control that implements an HTML table with automatic scrollbars. It gets its data through a Data event, and only displays the first hundred elements by default. A button allows to increase the number of displayed elements. The 'Mode' property allows to define the selection mode. When rows are selectable, an extra columns is added, with radion buttons on single selection mode, and checkboxes on multiple selection mode. The indexes of selected rows is returned by the 'Selection' property. * BUG: Many fixes in the default stylesheet. git-svn-id: svn://localhost/gambas/trunk@7536 867c0c6c-44f3-4631-809d-bfa615b0a4ec
616 lines
14 KiB
Text
616 lines
14 KiB
Text
' Gambas class file
|
|
|
|
'Property TagsX As Integer
|
|
|
|
Private $hPlayer As MediaPlayer
|
|
Private $hImage As MediaControl
|
|
Private $hFilter As MediaFilter
|
|
Private $hOutput As MediaContainer
|
|
Private $aVisualisation As MediaControl[]
|
|
|
|
Private $fPos As Float
|
|
Private $fLength As Float
|
|
Private $iVisualisation As Integer
|
|
Private $fVolume As Float
|
|
Private $bSuspend As Boolean
|
|
Private $bShowTags As Boolean
|
|
'Private $iTagsX As Integer
|
|
|
|
Public Sub _new()
|
|
|
|
Application.MainWindow = Me
|
|
'$iTagsX = - FTags.W
|
|
|
|
End
|
|
|
|
Private Sub AddVisualisation(sType As String, sTitle As String)
|
|
|
|
Dim hVisualisation As MediaControl
|
|
|
|
If sType Then
|
|
hVisualisation = New MediaControl($hPlayer, sType)
|
|
hVisualisation.Tag = sTitle
|
|
Endif
|
|
|
|
$aVisualisation.Add(hVisualisation)
|
|
|
|
Catch
|
|
|
|
Error sType; ": "; Error.Text
|
|
|
|
End
|
|
|
|
Private Sub MakeMediaPlayer()
|
|
|
|
$hPlayer = New MediaPlayer As "MediaPlayer"
|
|
|
|
'$hOutput = New MediaContainer($hPlayer)
|
|
'$hOutput.Name = "MyOutput"
|
|
|
|
$hFilter = New MediaFilter($hPlayer)
|
|
$hImage = New MediaControl($hPlayer, "ximagesink")
|
|
'$hFilter.LinkTo($hImage)
|
|
|
|
'$hOutput.AddInput($hImage)
|
|
|
|
$hPlayer.Video.Output = $hImage
|
|
|
|
$aVisualisation = New MediaControl[]
|
|
AddVisualisation("", "")
|
|
AddVisualisation("goom", "Goom")
|
|
AddVisualisation("goom2k1", "Goom2")
|
|
AddVisualisation("libvisual_bumpscope", "Bump")
|
|
AddVisualisation("libvisual_corona", "Corona")
|
|
AddVisualisation("libvisual_infinite", "Infinite")
|
|
AddVisualisation("libvisual_jakdaw", "Jakdaw")
|
|
AddVisualisation("libvisual_jess", "Jess")
|
|
AddVisualisation("monoscope", "Mono")
|
|
AddVisualisation("libvisual_oinksie", "Oinksie")
|
|
AddVisualisation("libvisual_lv_analyzer", "Analyzer")
|
|
AddVisualisation("libvisual_lv_scope", "Scope")
|
|
AddVisualisation("spacescope", "Space")
|
|
AddVisualisation("spectrascope", "Spectra")
|
|
AddVisualisation("synaescope", "Synae")
|
|
AddVisualisation("wavescope", "Wave")
|
|
|
|
$iVisualisation = 0
|
|
UpdateVisualisation
|
|
|
|
End
|
|
|
|
Public Sub GetButton(sKey As String) As CButton
|
|
|
|
Return FControl.Controls["#" & sKey]
|
|
|
|
End
|
|
|
|
|
|
Public Sub CreateButtons(aButton As String[], hParent As Container)
|
|
|
|
Dim sKey As String
|
|
Dim sImg As String
|
|
Dim hPanel As Panel
|
|
Dim hButton As CButton
|
|
Dim iPos As Integer
|
|
|
|
For Each sKey In aButton
|
|
|
|
If sKey = "<->" Then
|
|
hPanel = New Panel(hParent)
|
|
hPanel.Expand = True
|
|
hPanel.Resize(8, 48)
|
|
Else If sKey = "-" Then
|
|
hPanel = New Panel(hParent)
|
|
hPanel.Resize(8, 48)
|
|
Else
|
|
|
|
sImg = sKey
|
|
iPos = InStr(sImg, "#")
|
|
If iPos Then sImg = Left(sImg, iPos - 1)
|
|
|
|
hButton = New CButton(hParent) As "Button"
|
|
hButton.Resize(48, 48)
|
|
hButton.Image = Image.Load(sImg & ".png")
|
|
hButton.Tag = sKey
|
|
hButton.Name = "#" & sKey
|
|
'If cTooltip Then hButton.Tooltip = cTooltip[sImg]
|
|
'If $cShortcut Then hButton.Shortcut = $cShortcut[sImg]
|
|
'$cButton[hButton.Tag] = hButton
|
|
Endif
|
|
Next
|
|
|
|
End
|
|
|
|
|
|
Public Sub Form_Open()
|
|
|
|
MakeMediaPlayer
|
|
|
|
FControl.Show
|
|
FControl.Raise
|
|
|
|
RefreshVolume
|
|
|
|
End
|
|
|
|
Public Sub Form_KeyPress()
|
|
|
|
If Key.Code = Key.Escape Then Action("quit")
|
|
|
|
End
|
|
|
|
Private Sub GetDevice(sName As String) As String
|
|
|
|
Try Return Scan(sName, "* (*)")[1]
|
|
|
|
End
|
|
|
|
' Private Sub FindChildFromType(hCont As MediaContainer, sType As String) As MediaControl
|
|
'
|
|
' Dim hCtrl As MediaControl
|
|
'
|
|
' For I = 0 To hCont.Children.Count - 1
|
|
' hCtrl = hCont.Children[I]
|
|
' If hCtrl.Type = sType Then Return hCtrl
|
|
' Next
|
|
'
|
|
' End
|
|
|
|
Private Sub Dump(hCont As MediaContainer, Optional iIndent As Integer)
|
|
|
|
Dim I As Integer
|
|
Dim hCtrl As MediaControl
|
|
Dim sOutput As String
|
|
|
|
If iIndent = 0 Then
|
|
Print "Source: "; $hPlayer.Input.Name
|
|
Print "[-------------------------------------------"
|
|
Endif
|
|
For I = 0 To hCont.Children.Count - 1
|
|
hCtrl = hCont.Children[I]
|
|
Print Space$(iIndent * 2); hCtrl;; hCtrl.Name;; "["; hCtrl.Type; "]";; "=>";; hCtrl.Parent.Name
|
|
|
|
For Each sOutput In hCtrl.Inputs
|
|
With hCtrl.GetLink(sOutput)
|
|
If Not .Peer Then Continue
|
|
Print Space$(iIndent * 2); "| "; sOutput; " <--- "; .Peer.Name; "."; .Output
|
|
End With
|
|
Next
|
|
|
|
For Each sOutput In hCtrl.Outputs
|
|
With hCtrl.GetLink(sOutput)
|
|
If Not .Peer Then Continue
|
|
Print Space$(iIndent * 2); "| "; sOutput; " ---> "; .Peer.Name; "."; .Input
|
|
End With
|
|
Next
|
|
|
|
If hCtrl Is MediaContainer Then
|
|
Dump(hCtrl, iIndent + 1)
|
|
Endif
|
|
Next
|
|
If iIndent = 0 Then Print "-------------------------------------------]"
|
|
|
|
End
|
|
|
|
Private Sub Action(sAction As String)
|
|
|
|
Dim fPos As Float
|
|
Dim iState As Integer
|
|
Dim sName As String
|
|
Dim iName As Integer
|
|
Dim sVideo As String
|
|
|
|
Select sAction
|
|
|
|
Case "eject"
|
|
Dialog.Title = ("Select a media file")
|
|
If Not Dialog.OpenFile() Then
|
|
FControl.SetTitle(File.Name(Dialog.Path))
|
|
Action("stop")
|
|
$hPlayer.URL = Media.URL(Dialog.Path)
|
|
$hPlayer.Subtitles.Enabled = False
|
|
If Exist(File.SetExt(Dialog.Path, "srt")) Then
|
|
$hPlayer.Subtitles.URL = Media.URL(File.SetExt(Dialog.Path, "srt"))
|
|
$hPlayer.Subtitles.Enabled = True
|
|
Endif
|
|
UpdateSubtitle
|
|
FTags.Clear($hPlayer)
|
|
|
|
Action("play")
|
|
|
|
Endif
|
|
|
|
Case "video"
|
|
|
|
sVideo = FTags.GetVideoDevice()
|
|
If sVideo Then
|
|
FControl.SetTitle(("Video device") & " " & sVideo)
|
|
Action("stop")
|
|
$hPlayer.Subtitles.Enabled = False
|
|
$hPlayer.URL = "v4l2://" & GetDevice(sVideo)
|
|
UpdateSubtitle
|
|
FTags.Clear($hPlayer)
|
|
Action("play")
|
|
Endif
|
|
|
|
Case "info", "config"
|
|
If $bShowTags Then
|
|
CAnimation.Start(FTags, "Opacity", 0, 250, Me)
|
|
'CAnimation.Start(Me, "TagsX", - FTags.W, 250)
|
|
Else
|
|
FTags.X = - FTags.W
|
|
FTags.Show
|
|
CAnimation.Start(FTags, "Opacity", 70, 250)
|
|
'CAnimation.Start(Me, "TagsX", 0, 250)
|
|
Endif
|
|
$bShowTags = Not $bShowTags
|
|
|
|
Case "subtitle"
|
|
'If $hPlayer.State = Media.Playing Or If $hPlayer.State = Media.Paused Then
|
|
' $hPlayer.Subtitles.Enabled = Not $hPlayer.Subtitles.Enabled
|
|
' UpdateSubtitle
|
|
'Else
|
|
Dialog.Title = ("Select a subtitle file")
|
|
If Not Dialog.OpenFile() Then
|
|
$hPlayer.Subtitles.URL = Media.URL(Dialog.Path)
|
|
$hPlayer.Subtitles.Enabled = True
|
|
UpdateSubtitle
|
|
Endif
|
|
'Endif
|
|
|
|
Case "play"
|
|
SuspendScreenSaver
|
|
$hImage.SetWindow(dwgVideo) ', panLeft.X + panLeft.W + 8, panLeft.Y + 8, Me.W - panLeft.X - panLeft.W - 16, Me.H - panLeft.Y - 16)
|
|
EnableVideoFilter
|
|
Sleep 0.1
|
|
Try $hPlayer.Play
|
|
If Not Error Then
|
|
dwgVideo.Mouse = Mouse.Blank
|
|
timTime.Start
|
|
Dump($hPlayer)
|
|
Else
|
|
ResumeScreenSaver
|
|
Try $hPlayer.Stop
|
|
$fLength = 0
|
|
Endif
|
|
|
|
Case "stop"
|
|
ResumeScreenSaver
|
|
Try $hPlayer.Stop
|
|
$fLength = 0
|
|
timTime.Stop
|
|
dwgVideo.Mouse = Mouse.Default
|
|
|
|
Case "pause"
|
|
ResumeScreenSaver
|
|
$hPlayer.Pause
|
|
dwgVideo.Mouse = Mouse.Default
|
|
timTime.Stop
|
|
|
|
Case "fullscreen"
|
|
Me.FullScreen = Not Me.FullScreen
|
|
Me.Maximized = Not Me.FullScreen
|
|
Form_Resize
|
|
|
|
Case "volume"
|
|
$hPlayer.Audio.Mute = Not $hPlayer.Audio.Mute
|
|
RefreshVolume
|
|
|
|
'Case "balance"
|
|
'FBalance.Visible = Not FBalance.Visible
|
|
|
|
Case "visualisation"
|
|
|
|
iState = $hPlayer.State
|
|
If iState <> Media.Null And If iState <> Media.Ready Then
|
|
fPos = $hPlayer.Position
|
|
$hPlayer.Stop
|
|
$hPlayer.Close
|
|
timTime.Stop
|
|
'FadeOut
|
|
Endif
|
|
|
|
Inc $iVisualisation
|
|
If $iVisualisation >= $aVisualisation.Count Then $iVisualisation = 0
|
|
UpdateVisualisation
|
|
|
|
If iState <> Media.Null And If iState <> Media.Ready Then
|
|
$hPlayer.Pause
|
|
$hPlayer.Position = fPos
|
|
$hPlayer.State = iState
|
|
If iState = Media.Playing Then timTime.Start
|
|
'FadeIn
|
|
Endif
|
|
|
|
Case "quit"
|
|
Me.Close
|
|
|
|
Case "screenshot"
|
|
|
|
Do
|
|
Inc iName
|
|
sName = "~/MediaPlayerScreenshot"
|
|
If iName > 1 Then sName &= "-" & CStr(iName)
|
|
sName &= ".jpg"
|
|
If Not Exist(sName) Then Break
|
|
Loop
|
|
Try $hPlayer.Video.Image.Save(sName)
|
|
If Error Then FControl.SetError(Error.Text)
|
|
|
|
Case "seek-forward"
|
|
FControl.Y = Screen.H - FControl.H
|
|
|
|
Case "seek-backward"
|
|
FControl.Y = 600
|
|
|
|
End Select
|
|
|
|
End
|
|
|
|
Public Sub Button_Click()
|
|
|
|
Action(Last.Tag)
|
|
|
|
End
|
|
|
|
' Public Sub Form_Arrange()
|
|
'
|
|
' panToolbar.Move(0, Me.H - panToolbar.H, Me.W, panToolbar.H)
|
|
'
|
|
' End
|
|
|
|
Public Sub timTime_Timer()
|
|
|
|
$fPos = $hPlayer.Position
|
|
If $fLength = 0 Then $fLength = $hPlayer.Duration
|
|
FControl.SetInfo(Format(CDate(($fPos + 0.5) / 86400), "hh:nn:ss") & " / " & Format(CDate($fLength / 86400), "hh:nn:ss"))
|
|
|
|
End
|
|
|
|
Public Sub GetLength() As Float
|
|
|
|
Return $fLength
|
|
|
|
End
|
|
|
|
Public Sub GetPos() As Float
|
|
|
|
Return $fPos
|
|
|
|
End
|
|
|
|
Public Sub SetPos(fPos As Float)
|
|
|
|
If $hPlayer.State = Media.Paused Or If $hPlayer.State = Media.Playing Then
|
|
If $fLength Then
|
|
$fPos = fPos * $fLength
|
|
'$hPlayer.Pause
|
|
'FadeOut
|
|
$hPlayer.Position = $fPos
|
|
'$hPlayer.Play
|
|
'FadeIn
|
|
Endif
|
|
Endif
|
|
|
|
End
|
|
|
|
Public Sub Form_Resize()
|
|
|
|
'Debug Me.X;; Me.Y;; Me.W;; Me.H;; FControl.H;; Me.Y + Me.H - FControl.H
|
|
'Debug "FControl.Move:";; Me.X;; Me.Y + Me.H - FControl.H;; Me.W;; FControl.H
|
|
FControl.Move(dwgVideo.ScreenX, dwgVideo.ScreenY + dwgVideo.H - FControl.H, dwgVideo.W, FControl.H)
|
|
FTags.Move(dwgVideo.ScreenX, dwgVideo.ScreenY, FTags.W, dwgVideo.H - FControl.H)
|
|
|
|
End
|
|
|
|
Public Sub Form_Close()
|
|
|
|
ResumeScreenSaver
|
|
CAnimation.Exit
|
|
|
|
End
|
|
|
|
Public Sub Button_MouseWheel()
|
|
|
|
$hPlayer.Audio.Mute = False
|
|
|
|
If Mouse.Delta > 0 Then
|
|
$hPlayer.Audio.Volume = Min(1, (Sqr($hPlayer.Audio.Volume) + 0.05) ^ 2)
|
|
Else
|
|
$hPlayer.Audio.Volume = Max(0, (Sqr($hPlayer.Audio.Volume) - 0.05) ^ 2)
|
|
Endif
|
|
|
|
RefreshVolume
|
|
|
|
End
|
|
|
|
Private Sub RefreshVolume()
|
|
|
|
Dim sImage As String
|
|
Dim fVolume As Float
|
|
|
|
With GetButton("volume")
|
|
|
|
If $hPlayer.Audio.Mute Then
|
|
sImage = "mute"
|
|
.Text = ""
|
|
Else
|
|
fVolume = Sqr($hPlayer.Audio.Volume)
|
|
.Text = Format(fVolume, "0%")
|
|
sImage = "volume-" & Min(3, CInt(fVolume * 4))
|
|
Endif
|
|
|
|
.Image = Image.Load(sImage & ".png")
|
|
|
|
End With
|
|
|
|
End
|
|
|
|
Private Sub UpdateSubtitle()
|
|
|
|
GetButton("subtitle").Text = If($hPlayer.Subtitles.Enabled, "ON", "")
|
|
|
|
End
|
|
|
|
Private Sub UpdateVisualisation()
|
|
|
|
Dim hVis As MediaControl = $aVisualisation[$iVisualisation]
|
|
|
|
$hPlayer.Video.Visualisation = hVis
|
|
If hVis Then
|
|
GetButton("visualisation").Text = hVis.Tag
|
|
$hImage.SetWindow(dwgVideo)
|
|
$hPlayer.Position = $hPlayer.Position
|
|
Else
|
|
GetButton("visualisation").Text = ""
|
|
$hImage.SetWindow(Null)
|
|
Endif
|
|
|
|
End
|
|
|
|
Public Sub dwgVideo_Draw()
|
|
|
|
If $hPlayer.State = Media.Null Then
|
|
Draw.Font = Font["+16"]
|
|
Draw.Foreground = Color.Gray
|
|
Draw.RichText("<b>G</b>ambas <b>A</b>lmost <b>M</b>eans <b>Bas</b>ic!", 0, 0, dwgVideo.Width, dwgVideo.Height, Align.Center)
|
|
Endif
|
|
|
|
End
|
|
|
|
Public Sub MediaPlayer_End()
|
|
|
|
Action("stop")
|
|
|
|
End
|
|
|
|
Public Sub MediaPlayer_Message((Source) As MediaControl, Type As Integer, Message As String)
|
|
|
|
Select Case Type
|
|
Case Media.Info
|
|
Print "(i)";
|
|
Case Media.Warning
|
|
Print "/!\\";
|
|
Case Media.Error
|
|
Print "[*]";
|
|
End Select
|
|
Print " "; Message
|
|
|
|
If Type = Media.Error Then
|
|
FControl.SetError(Message)
|
|
Action("stop")
|
|
Endif
|
|
|
|
End
|
|
|
|
|
|
Public Sub MediaPlayer_Tag(TagList As MediaTagList)
|
|
|
|
Dim sTag As String
|
|
Dim vTag As Variant
|
|
Dim I As Integer
|
|
|
|
For Each sTag In TagList.Tags
|
|
vTag = TagList[sTag]
|
|
If TypeOf(vTag) = gb.Object And If vTag Is Array Then
|
|
For I = 0 To vTag.Max
|
|
FTags.AddTag(sTag & "[" & CStr(I) & "]", Str(vTag[I]))
|
|
Next
|
|
Else
|
|
FTags.AddTag(sTag, Str(vTag))
|
|
Endif
|
|
Next
|
|
|
|
End
|
|
|
|
|
|
Private Sub FadeOut()
|
|
|
|
$fVolume = $hPlayer.Audio.Volume
|
|
|
|
Do
|
|
Debug $hPlayer.Audio.Volume
|
|
$hPlayer.Audio.Volume = Max(0, $hPlayer.Audio.Volume - 0.05)
|
|
If $hPlayer.Audio.Volume = 0 Then Break
|
|
Sleep 0.01
|
|
Loop
|
|
|
|
End
|
|
|
|
Private Sub FadeIn()
|
|
|
|
Do
|
|
Debug $hPlayer.Audio.Volume
|
|
$hPlayer.Audio.Volume = Min($fVolume, $hPlayer.Audio.Volume + 0.05)
|
|
If $hPlayer.Audio.Volume >= $fVolume Then Break
|
|
Sleep 0.01
|
|
Loop
|
|
|
|
End
|
|
|
|
Private Sub SuspendScreenSaver()
|
|
|
|
If $bSuspend Then Return
|
|
Desktop.ScreenSaver.Suspend(Me)
|
|
|
|
End
|
|
|
|
Private Sub ResumeScreenSaver()
|
|
|
|
If Not $bSuspend Then Return
|
|
Desktop.ScreenSaver.Resume(Me)
|
|
|
|
End
|
|
|
|
Public Sub Form_Enter()
|
|
|
|
If $hPlayer.State = Media.Playing Then
|
|
CAnimation.Start(FControl, "Opacity", 0, 400)
|
|
CAnimation.Start(FTags, "Opacity", 0, 400)
|
|
Endif
|
|
|
|
End
|
|
|
|
Public Sub Form_Leave()
|
|
|
|
If $hPlayer.State = Media.Playing Then
|
|
CAnimation.Start(FControl, "Opacity", 70, 250)
|
|
If $bShowTags Then CAnimation.Start(FTags, "Opacity", 70, 250)
|
|
Endif
|
|
|
|
End
|
|
|
|
Public Sub Animation_Stop()
|
|
|
|
FTags.Hide
|
|
|
|
End
|
|
|
|
' Private Function TagsX_Read() As Integer
|
|
'
|
|
' Return $iTagsX
|
|
'
|
|
' End
|
|
'
|
|
' Private Sub TagsX_Write(Value As Integer)
|
|
'
|
|
' $iTagsX = Value
|
|
' FTags.X = Me.X + $iTagsX
|
|
'
|
|
' End
|
|
|
|
Public Sub SetBalance(iIndex As Integer, iValue As Integer)
|
|
|
|
$hPlayer.Balance[iIndex].Value = iValue
|
|
|
|
End
|
|
|
|
Private Sub EnableVideoFilter()
|
|
|
|
'If $hPlayer.URL Begins "v4l2://" Then
|
|
' $hFilter.Filter = "video/x-raw,width=640,height=480,framerate=30/1"
|
|
'Else
|
|
' $hFilter.Filter = "video/x-raw"
|
|
'Endif
|
|
|
|
End
|