Code: Select all
/* ------------------------------
Programa de prueba
------------------------------ */
#include "hmg.ch"
#include "hbdyn.ch"
#define CRLF INetCRLF()
PROCEDURE Main()
PUBLIC pDLL
PUBLIC pVLCNew, pMediaNewLoc, pMediaNewPath, pPlayerNew, pSetHWND, pPlay
// Resolver funciones necesarias
pVLCNew := hb_DynCall( { "libvlc_new", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_INT, HB_DYN_CTYPE_PTR } )
pMediaNewLoc := hb_DynCall( { "libvlc_media_new_location", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pMediaNewPath := hb_DynCall( { "libvlc_media_new_path", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pPlayerNew := hb_DynCall( { "libvlc_media_player_new_from_media", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR } )
pSetHWND := hb_DynCall( { "libvlc_media_player_set_hwnd", pDLL }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_LONG } )
pPlay := hb_DynCall( { "libvlc_media_player_play", pDLL }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
PlayStream( "192.168.100.16:554" )
RETURN
//-----------------------------------------------------------
// Abrir cuadro de diálogo para seleccionar archivo local
//-----------------------------------------------------------
FUNCTION BrowseFile()
LOCAL cFile := GetFile( { {"Videos", "*.mp4;*.avi;*.mkv;*.mov;*.flv"}, ;
{"Todos los archivos", "*.*"} }, ;
"Seleccionar archivo de video", "C:\videos\" )
IF !Empty( cFile )
// Main.txtSource.Value := cFile
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Inicializa VLC y reproduce un stream o archivo
//-----------------------------------------------------------
FUNCTION PlayStream( cSource )
IF Empty( AllTrim( cSource ) )
MsgStop( "Debe ingresar una URL o archivo" )
RETURN NIL
ENDIF
IF Empty( pDLL )
pDLL := hb_LibLoad( "libvlc.dll" )
IF Empty( pDLL )
? "No se pudo cargar libvlc.dll"
RETURN NIL
ENDIF
ENDIF
IF Empty( hVLC )
hVLC := pVLCNew( 0, 0 )
ENDIF
IF File( cSource ) .OR. ( ":" $ cSource )
hMedia := pMediaNewPath( hVLC, cSource )
ELSE
hMedia := pMediaNewLoc( hVLC, cSource )
ENDIF
hPlayer := pPlayerNew( hMedia )
pSetHWND( hPlayer, GetControlHandle( "frm1", "Main" ) )
pPlay( hPlayer )
RETURN NIL
//-----------------------------------------------------------
// Pause / Resume
//-----------------------------------------------------------
FUNCTION PauseStream()
LOCAL pPause := hb_DynCall( { "libvlc_media_player_pause", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pPause( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Stop
//-----------------------------------------------------------
FUNCTION StopStream()
LOCAL pStop := hb_DynCall( { "libvlc_media_player_stop", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pStop( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Volumen + / -
//-----------------------------------------------------------
FUNCTION VolumeUp()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Min( 200, nVol + 10 ) ) // máximo 200%
ENDIF
RETURN NIL
FUNCTION VolumeDown()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Max( 0, nVol - 10 ) )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Fullscreen On/Off
//-----------------------------------------------------------
FUNCTION ToggleFullScreen()
LOCAL pToggle := hb_DynCall( { "libvlc_toggle_fullscreen", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pToggle( hPlayer )
ENDIF
RETURN NIL
]]>hbmk2: Harbour: Compilando m¢dulos...
Harbour 3.2.0dev (r1703241902)
Copyright (c) 1999-2016, http://harbour-project.org/
hbmk2: Compilando...
hbmk2: Enlazando... hmgvlc.exe
.hbmk/win/mingw/Main.o:Main.c:(.data+0x178): undefined reference to `HB_FUN_PVLCNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x198): undefined reference to `HB_FUN_PMEDIANEWPATH'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1b8): undefined reference to `HB_FUN_PMEDIANEWLOC'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1c8): undefined reference to `HB_FUN_PPLAYERNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1e8): undefined reference to `HB_FUN_PSETHWND'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x208): undefined reference to `HB_FUN_PPLAY'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x228): undefined reference to `HB_FUN_PPAUSE'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x248): undefined reference to `HB_FUN_PSTOP'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x268): undefined reference to `HB_FUN_PGETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x278): undefined reference to `HB_FUN_PSETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x2c8): undefined reference to `HB_FUN_PTOGGLE'
collect2.exe: error: ld returned 1 exit status
hbmk2[hmgvlc]: Error: Ejecutando enlazador. 1
gcc.exe .hbmk/win/mingw/Main.o .hbmk/win/mingw/_hbmkaut_Main.o C:/Temp/HmgVlc/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -ohmgvlc.exe -LC:/hmg.3.4.4/harbour/lib/win/mingw -LC:/hmg.3.4.4/lib
hbmk2: Error: Funci¢n(es) referenciada, no encontrada, pero desconocida:
PVLCNEW(), PMEDIANEWPATH(), PMEDIANEWLOC(), PPLAYERNEW(), PSETHWND(),
PPLAY(), PPAUSE(), PSTOP(), PGETVOL(), PSETVOL(), PTOGGLE()
Code: Select all
/* ------------------------------
Programa de prueba
------------------------------ */
#include "hmg.ch"
#include "hbdyn.ch"
#define CRLF INetCRLF()
PROCEDURE Main()
PUBLIC pDLL
PUBLIC pVLCNew, pMediaNewLoc, pMediaNewPath, pPlayerNew, pSetHWND, pPlay
// Resolver funciones necesarias
pVLCNew := hb_DynCall( { "libvlc_new", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_INT, HB_DYN_CTYPE_PTR } )
pMediaNewLoc := hb_DynCall( { "libvlc_media_new_location", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pMediaNewPath := hb_DynCall( { "libvlc_media_new_path", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_STRING } )
pPlayerNew := hb_DynCall( { "libvlc_media_player_new_from_media", pDLL }, HB_DYN_CTYPE_PTR, { HB_DYN_CTYPE_PTR } )
pSetHWND := hb_DynCall( { "libvlc_media_player_set_hwnd", pDLL }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_LONG } )
pPlay := hb_DynCall( { "libvlc_media_player_play", pDLL }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
PlayStream( "192.168.100.16:554" )
RETURN
//-----------------------------------------------------------
// Abrir cuadro de diálogo para seleccionar archivo local
//-----------------------------------------------------------
FUNCTION BrowseFile()
LOCAL cFile := GetFile( { {"Videos", "*.mp4;*.avi;*.mkv;*.mov;*.flv"}, ;
{"Todos los archivos", "*.*"} }, ;
"Seleccionar archivo de video", "C:\videos\" )
IF !Empty( cFile )
// Main.txtSource.Value := cFile
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Inicializa VLC y reproduce un stream o archivo
//-----------------------------------------------------------
FUNCTION PlayStream( cSource )
IF Empty( AllTrim( cSource ) )
MsgStop( "Debe ingresar una URL o archivo" )
RETURN NIL
ENDIF
IF Empty( pDLL )
pDLL := hb_LibLoad( "libvlc.dll" )
IF Empty( pDLL )
? "No se pudo cargar libvlc.dll"
RETURN NIL
ENDIF
ENDIF
IF Empty( hVLC )
hVLC := pVLCNew( 0, 0 )
ENDIF
IF File( cSource ) .OR. ( ":" $ cSource )
hMedia := pMediaNewPath( hVLC, cSource )
ELSE
hMedia := pMediaNewLoc( hVLC, cSource )
ENDIF
hPlayer := pPlayerNew( hMedia )
pSetHWND( hPlayer, GetControlHandle( "frm1", "Main" ) )
pPlay( hPlayer )
RETURN NIL
//-----------------------------------------------------------
// Pause / Resume
//-----------------------------------------------------------
FUNCTION PauseStream()
LOCAL pPause := hb_DynCall( { "libvlc_media_player_pause", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pPause( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Stop
//-----------------------------------------------------------
FUNCTION StopStream()
LOCAL pStop := hb_DynCall( { "libvlc_media_player_stop", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pStop( hPlayer )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Volumen + / -
//-----------------------------------------------------------
FUNCTION VolumeUp()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Min( 200, nVol + 10 ) ) // máximo 200%
ENDIF
RETURN NIL
FUNCTION VolumeDown()
LOCAL pGetVol := hb_DynCall( { "libvlc_audio_get_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR } )
LOCAL pSetVol := hb_DynCall( { "libvlc_audio_set_volume", "libvlc.dll" }, HB_DYN_CTYPE_INT, { HB_DYN_CTYPE_PTR, HB_DYN_CTYPE_INT } )
LOCAL nVol
IF !Empty( hPlayer )
nVol := pGetVol( hPlayer )
pSetVol( hPlayer, Max( 0, nVol - 10 ) )
ENDIF
RETURN NIL
//-----------------------------------------------------------
// Fullscreen On/Off
//-----------------------------------------------------------
FUNCTION ToggleFullScreen()
LOCAL pToggle := hb_DynCall( { "libvlc_toggle_fullscreen", "libvlc.dll" }, HB_DYN_CTYPE_VOID, { HB_DYN_CTYPE_PTR } )
IF !Empty( hPlayer )
pToggle( hPlayer )
ENDIF
RETURN NIL
]]>hbmk2: Harbour: Compilando m¢dulos...
Harbour 3.2.0dev (r1703241902)
Copyright (c) 1999-2016, http://harbour-project.org/
hbmk2: Compilando...
hbmk2: Enlazando... hmgvlc.exe
.hbmk/win/mingw/Main.o:Main.c:(.data+0x178): undefined reference to `HB_FUN_PVLCNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x198): undefined reference to `HB_FUN_PMEDIANEWPATH'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1b8): undefined reference to `HB_FUN_PMEDIANEWLOC'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1c8): undefined reference to `HB_FUN_PPLAYERNEW'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x1e8): undefined reference to `HB_FUN_PSETHWND'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x208): undefined reference to `HB_FUN_PPLAY'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x228): undefined reference to `HB_FUN_PPAUSE'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x248): undefined reference to `HB_FUN_PSTOP'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x268): undefined reference to `HB_FUN_PGETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x278): undefined reference to `HB_FUN_PSETVOL'
.hbmk/win/mingw/Main.o:Main.c:(.data+0x2c8): undefined reference to `HB_FUN_PTOGGLE'
collect2.exe: error: ld returned 1 exit status
hbmk2[hmgvlc]: Error: Ejecutando enlazador. 1
gcc.exe .hbmk/win/mingw/Main.o .hbmk/win/mingw/_hbmkaut_Main.o C:/Temp/HmgVlc/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -ohmgvlc.exe -LC:/hmg.3.4.4/harbour/lib/win/mingw -LC:/hmg.3.4.4/lib
hbmk2: Error: Funci¢n(es) referenciada, no encontrada, pero desconocida:
PVLCNEW(), PMEDIANEWPATH(), PMEDIANEWLOC(), PPLAYERNEW(), PSETHWND(),
PPLAY(), PPAUSE(), PSTOP(), PGETVOL(), PSETVOL(), PTOGGLE()
Code: Select all
#include "hmg.ch"
FUNCTION MAIN()
/*****************/
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 930 HEIGHT 400 ;
TITLE ' T e s t';
FONT "Arial" SIZE 09
ON KEY ESCAPE ACTION Form_1.Release
@ 10,840 LABEL LABEL_LEN_TB_1 ;
VALUE " " ;
WIDTH 100 ;
HEIGHT 35 ;
BOLD
DEFINE EDITBOX TB_1
ROW 10
COL 10
WIDTH 820
HEIGHT 250
VALUE '1234567890123456789012345678901234567890123456789012345678901234567890'
TOOLTIP ''
MAXLENGTH 2000
ON CHANGE TEST_LEN()
END EDITBOX
END WINDOW
Form_1.TB_1.SetFocus
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN
FUNCTION TEST_LEN()
/******************/
LOCAL cResult := "", n, nPOS
Form_1.LABEL_LEN_TB_1.Value := LEN(Form_1.TB_1.Value)
FOR n := 80 TO 800 STEP 80
IF LEN(Form_1.TB_1.Value) == 80
FOR nPos := 1 TO Len( Form_1.TB_1.Value ) STEP 80
cResult += SubStr( Form_1.TB_1.Value, nPos, 80 ) + CRLF
NEXT
Form_1.TB_1.Value := cResult
EXIT
ENDIF
NEXT
Code: Select all
#include "hmg.ch"
FUNCTION MAIN()
/*****************/
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 930 HEIGHT 400 ;
TITLE ' T e s t';
FONT "Arial" SIZE 09
ON KEY ESCAPE ACTION Form_1.Release
@ 10,840 LABEL LABEL_LEN_TB_1 ;
VALUE " " ;
WIDTH 100 ;
HEIGHT 35 ;
BOLD
DEFINE EDITBOX TB_1
ROW 10
COL 10
WIDTH 820
HEIGHT 250
VALUE '1234567890123456789012345678901234567890123456789012345678901234567890'
TOOLTIP ''
MAXLENGTH 2000
ON CHANGE TEST_LEN()
END EDITBOX
END WINDOW
Form_1.TB_1.SetFocus
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN
FUNCTION TEST_LEN()
/******************/
LOCAL cResult := "", n, nPOS
Form_1.LABEL_LEN_TB_1.Value := LEN(Form_1.TB_1.Value)
FOR n := 80 TO 800 STEP 80
IF LEN(Form_1.TB_1.Value) == 80
FOR nPos := 1 TO Len( Form_1.TB_1.Value ) STEP 80
cResult += SubStr( Form_1.TB_1.Value, nPos, 80 ) + CRLF
NEXT
Form_1.TB_1.Value := cResult
EXIT
ENDIF
NEXT
Code: Select all
CaretPos := len(VALUE)Code: Select all
CaretPos := len(VALUE)Code: Select all
#include <hmg.ch>
#include "hbsocket.ch"
FUNCTION Main()
PUBLIC oSocket , cRequest
PUBLIC cRtspDescribe := Space( 1024 )
PUBLIC cRtspSetup := Space( 1024 )
PUBLIC cRtspPlay := Space( 1024 )
PUBLIC nPos, nEnd, nSeq := 0
PUBLIC cSession := ""
PUBLIC cServerIP := "192.168.100.16" // IP de la cámara
PUBLIC nPort := 554 // Puerto RTSP
LOAD Window Main
Center Window Main
Activate Window Main
FUNCTION Connect()
oSocket := hb_socketOpen()
IF oSocket == NIL
MSGINFO("Error al crear socket")
RETURN
ENDIF
IF ! hb_socketConnect( oSocket, {HB_SOCKET_AF_INET, cServerIP, nPort } )
MSGINFO("No se pudo conectar a:", cServerIP)
hb_socketClose( oSocket )
RETURN
ENDIF
// 1) DESCRIBE
nSeq++
cRequest := "DESCRIBE rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourClient/1.0\r\n" + CRLF + ;
"Accept: application/sdp\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspDescribe, LEN( cRtspDescribe ) )
// 2) SETUP
nSeq++
cRequest := "SETUP rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0/trackID=0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourHMGClient/1.0\r\n" + CRLF + ;
"Transport: RTP/AVP/TCP;unicast;interleaved=2\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspSetup )
// Extraer Session ID
PUBLIC nPos, nEnd, cSession := ""
nPos := AT( "Session:", cRtspSetup )
IF nPos > 0
nEnd := AT( CRLF, SUBSTR( cRtspSetup, nPos ) )
cSession:= ALLTRIM( SUBSTR( cRtspSetup, nPos + 8, nEnd-1 ) )
ENDIF
// 3) PLAY
nSeq++
cRequest := "PLAY rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM(STR(nSeq)) + CRLF + ;
"Session: " + cSession + CRLF + ;
"Range: npt=0.000-\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspPlay , LEN( cRtspPlay ))
WAITWINDOW()
hb_socketClose( oSocket )
RETURNCode: Select all
#include <hmg.ch>
#include "hbsocket.ch"
FUNCTION Main()
PUBLIC oSocket , cRequest
PUBLIC cRtspDescribe := Space( 1024 )
PUBLIC cRtspSetup := Space( 1024 )
PUBLIC cRtspPlay := Space( 1024 )
PUBLIC nPos, nEnd, nSeq := 0
PUBLIC cSession := ""
PUBLIC cServerIP := "192.168.100.16" // IP de la cámara
PUBLIC nPort := 554 // Puerto RTSP
LOAD Window Main
Center Window Main
Activate Window Main
FUNCTION Connect()
oSocket := hb_socketOpen()
IF oSocket == NIL
MSGINFO("Error al crear socket")
RETURN
ENDIF
IF ! hb_socketConnect( oSocket, {HB_SOCKET_AF_INET, cServerIP, nPort } )
MSGINFO("No se pudo conectar a:", cServerIP)
hb_socketClose( oSocket )
RETURN
ENDIF
// 1) DESCRIBE
nSeq++
cRequest := "DESCRIBE rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourClient/1.0\r\n" + CRLF + ;
"Accept: application/sdp\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspDescribe, LEN( cRtspDescribe ) )
// 2) SETUP
nSeq++
cRequest := "SETUP rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0/trackID=0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM( STR( nSeq ) ) + "\r\n" + CRLF + ;
"User-Agent: HarbourHMGClient/1.0\r\n" + CRLF + ;
"Transport: RTP/AVP/TCP;unicast;interleaved=2\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspSetup )
// Extraer Session ID
PUBLIC nPos, nEnd, cSession := ""
nPos := AT( "Session:", cRtspSetup )
IF nPos > 0
nEnd := AT( CRLF, SUBSTR( cRtspSetup, nPos ) )
cSession:= ALLTRIM( SUBSTR( cRtspSetup, nPos + 8, nEnd-1 ) )
ENDIF
// 3) PLAY
nSeq++
cRequest := "PLAY rtsp://192.168.100.16:554/22992e47b611dde40dde83b803ca1ab0_0 RTSP/1.0\r\n" + CRLF + ;
"CSeq: " + LTRIM(STR(nSeq)) + CRLF + ;
"Session: " + cSession + CRLF + ;
"Range: npt=0.000-\r\n" + CRLF + CRLF
hb_socketSend( oSocket, cRequest )
hb_socketRecv( oSocket, @cRtspPlay , LEN( cRtspPlay ))
WAITWINDOW()
hb_socketClose( oSocket )
RETURN]]>En Android o la PC, al instalar la aplicacion te insiste en agregar la camara con su QR o Codigo que tiene en una etiqueta. al ejecutar el programa o aplicacion te pide solamente el password y despues te recomienda cambiarlo. nunca ms te pide entrarlo por eso yo uso la cadena RTSP que veo en WIRESHARK.
estoy estudiando la forma de recuperar la SessionID que devuelve el Metodo "SETUP" al cual no est devolviendo con mi programa pero si en el caso de la aplicacion oficial.
de paso estoy encapsulando todo el Clases
sin embargo con el metodo "OPTION" que no veo que usa la aplicacion oficial mediante WireShark si devuelve la SessionID que es requerida por otros Metodos de RTSP
]]>En Android o la PC, al instalar la aplicacion te insiste en agregar la camara con su QR o Codigo que tiene en una etiqueta. al ejecutar el programa o aplicacion te pide solamente el password y despues te recomienda cambiarlo. nunca ms te pide entrarlo por eso yo uso la cadena RTSP que veo en WIRESHARK.
estoy estudiando la forma de recuperar la SessionID que devuelve el Metodo "SETUP" al cual no est devolviendo con mi programa pero si en el caso de la aplicacion oficial.
de paso estoy encapsulando todo el Clases
sin embargo con el metodo "OPTION" que no veo que usa la aplicacion oficial mediante WireShark si devuelve la SessionID que es requerida por otros Metodos de RTSP
Code: Select all
IF ! VLC_LoadLib( libPath )
? "❌ Error: no se pudo cargar", libPath
RETURN
ENDIF
? "✅ libvlc.dll cargada correctamente."Code: Select all
// --- 4) Llamar a VLC_New()
inst := VLC_New( NIL )
IF inst == 0
? "⚠️ VLC_New devolvió NULL (0)."
VLC_UnloadLib()
RETURN
ELSE
? "Instancia creada correctamente:", Hex64( inst )
ENDIFCode: Select all
#include "hmg.ch"
#include "vlc_bridge64.c"
#define CRLF INetCRLF()
FUNCTION Main()
LOCAL cLib := "libvlc.dll"
LOCAL cPlugins := ".\\plugins"
LOCAL cFile := "video.mp4"
PUBLIC pMediaPlayer
PUBLIC cCurrentFolder := GetCurrentFolder()
PUBLIC oRTSP := RTSPConnection():New( "192.168.100.16", 554 )
PUBLIC pInst
PUBLIC lOk
DEFINE WINDOW Main ;Application Internal Error - C:\Temp\Camera\Camera.exe
Terminated at: 2025-10-18 21:30:37
Unrecoverable error 9012: Can't locate the starting procedure: 'MAIN'
------------------------------------------------------------------------
Attachments
Code: Select all
IF ! VLC_LoadLib( libPath )
? "❌ Error: no se pudo cargar", libPath
RETURN
ENDIF
? "✅ libvlc.dll cargada correctamente."Code: Select all
// --- 4) Llamar a VLC_New()
inst := VLC_New( NIL )
IF inst == 0
? "⚠️ VLC_New devolvió NULL (0)."
VLC_UnloadLib()
RETURN
ELSE
? "Instancia creada correctamente:", Hex64( inst )
ENDIFCode: Select all
#include "hmg.ch"
#include "vlc_bridge64.c"
#define CRLF INetCRLF()
FUNCTION Main()
LOCAL cLib := "libvlc.dll"
LOCAL cPlugins := ".\\plugins"
LOCAL cFile := "video.mp4"
PUBLIC pMediaPlayer
PUBLIC cCurrentFolder := GetCurrentFolder()
PUBLIC oRTSP := RTSPConnection():New( "192.168.100.16", 554 )
PUBLIC pInst
PUBLIC lOk
DEFINE WINDOW Main ;Application Internal Error - C:\Temp\Camera\Camera.exe
Terminated at: 2025-10-18 21:30:37
Unrecoverable error 9012: Can't locate the starting procedure: 'MAIN'
------------------------------------------------------------------------
Attachments
Code: Select all
#pragma BEGINDUMP
....... C code ......
#pragma ENDDUMPCode: Select all
#pragma BEGINDUMP
....... C code ......
#pragma ENDDUMPCode: Select all
dumpbin /exports libvlc.dll | find "vlc_"Code: Select all
#pragma BEGINDUMP
#include "hbapi.h"
#include <windows.h>
#include <stdint.h> // para tipos enteros fijos
// --- Tipos básicos equivalentes ---
typedef int64_t libvlc_time_t;
// --- Funciones de libVLC ---
typedef void * (__cdecl *PFN_LIBVLC_NEW)(int, const char *const *);
typedef void (__cdecl *PFN_LIBVLC_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_PATH)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_RELEASE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PLAY)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_STOP)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SETHWND)(void *, void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_TIME)(void *);
static HMODULE hVlc = NULL;
static PFN_LIBVLC_NEW pLibVLC_New = NULL;
static PFN_LIBVLC_RELEASE pLibVLC_Release = NULL;
static PFN_LIBVLC_MEDIA_NEW_PATH pLibVLC_Media_New_Path = NULL;
static PFN_LIBVLC_MEDIA_RELEASE pLibVLC_Media_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW pLibVLC_MediaPlayer_New = NULL;
static PFN_LIBVLC_MEDIAPLAYER_RELEASE pLibVLC_MediaPlayer_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA pLibVLC_MediaPlayer_Set_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PLAY pLibVLC_MediaPlayer_Play = NULL;
static PFN_LIBVLC_MEDIAPLAYER_STOP pLibVLC_MediaPlayer_Stop = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_TIME pLibVLC_MediaPlayer_GetTime = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SETHWND pLibVLC_MediaPlayer_SetHwnd = NULL;
// --- Carga la DLL y obtiene punteros ---
HB_FUNC( VLC_LOADLIB )
{
const char * path = hb_parc( 1 );
hVlc = LoadLibraryA( path ? path : "libvlc.dll" );
if( !hVlc )
{
hb_retl( HB_FALSE );
return;
}
pLibVLC_New = (PFN_LIBVLC_NEW) GetProcAddress( hVlc, "libvlc_new" );
pLibVLC_Release = (PFN_LIBVLC_RELEASE) GetProcAddress( hVlc, "libvlc_release" );
pLibVLC_Media_New_Path = (PFN_LIBVLC_MEDIA_NEW_PATH) GetProcAddress( hVlc, "libvlc_media_new_path" );
pLibVLC_Media_Release = (PFN_LIBVLC_MEDIA_RELEASE) GetProcAddress( hVlc, "libvlc_media_release" );
pLibVLC_MediaPlayer_New = (PFN_LIBVLC_MEDIAPLAYER_NEW) GetProcAddress( hVlc, "libvlc_media_player_new" );
pLibVLC_MediaPlayer_Release = (PFN_LIBVLC_MEDIAPLAYER_RELEASE) GetProcAddress( hVlc, "libvlc_media_player_release" );
pLibVLC_MediaPlayer_Set_Media = (PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_set_media" );
pLibVLC_MediaPlayer_Play = (PFN_LIBVLC_MEDIAPLAYER_PLAY) GetProcAddress( hVlc, "libvlc_media_player_play" );
pLibVLC_MediaPlayer_Stop = (PFN_LIBVLC_MEDIAPLAYER_STOP) GetProcAddress( hVlc, "libvlc_media_player_stop" );
pLibVLC_MediaPlayer_GetTime = (PFN_LIBVLC_MEDIAPLAYER_GET_TIME) GetProcAddress( hVlc, "libvlc_media_player_get_time" );
hb_retl( pLibVLC_New != NULL );
}
// --- Libera la DLL ---
HB_FUNC( VLC_UNLOADLIB )
{
if( hVlc )
{
FreeLibrary( hVlc );
hVlc = NULL;
}
}
// --- Obtiene dirección de símbolo ---
HB_FUNC( VLC_GETSYMBOLADDRESS )
{
const char * name = hb_parc(1);
FARPROC addr = NULL;
if( hVlc && name )
addr = GetProcAddress( hVlc, name );
hb_retnll( (HB_LONGLONG)(LONG_PTR) addr );
}
// --- Crea una instancia de VLC ---
HB_FUNC( VLC_NEW )
{
void *inst = NULL;
if( pLibVLC_New )
inst = pLibVLC_New( 0, NULL );
hb_retnll( (HB_LONGLONG)(LONG_PTR) inst );
}
// --- Libera instancia ---
HB_FUNC( VLC_RELEASE )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_Release && inst )
pLibVLC_Release( inst );
}
// --- Reproduce un archivo ---
HB_FUNC( VLC_PLAYPATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
void *media = NULL;
void *mp = NULL;
if( !inst || !path || !pLibVLC_Media_New_Path )
{
hb_retnll(0);
return;
}
media = pLibVLC_Media_New_Path( inst, path );
mp = pLibVLC_MediaPlayer_New( inst );
if( media && mp )
{
pLibVLC_MediaPlayer_Set_Media( mp, media );
pLibVLC_Media_Release( media );
pLibVLC_MediaPlayer_Play( mp );
}
hb_retnll( (HB_LONGLONG)(LONG_PTR) mp );
}
// --- Devuelve tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERGETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_GetTime && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_GetTime( mp ) : 0 );
}
// --- Detiene reproducción ---
HB_FUNC( VLC_MEDIAPLAYERSTOP )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Stop && mp )
pLibVLC_MediaPlayer_Stop( mp );
}
// --- Libera reproductor ---
HB_FUNC( VLC_MEDIAPLAYERRELEASE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Release && mp )
pLibVLC_MediaPlayer_Release( mp );
}
// --- Asocia la ventana de reproducción (HWND) ---
// Permite reproducir el video dentro de un control HMG (ej. FrameVideo)
HB_FUNC( VLC_MEDIAPLAYERSETHWND )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1); // MediaPlayer
HWND hWnd = (HWND)(LONG_PTR) hb_parnll(2); // Handle de control HMG
if( pLibVLC_MediaPlayer_SetHwnd == NULL && hVlc )
{
// obtener dirección si no se cargó aún
pLibVLC_MediaPlayer_SetHwnd = (PFN_LIBVLC_MEDIAPLAYER_SETHWND)
GetProcAddress( hVlc, "libvlc_media_player_set_hwnd" );
}
if( pLibVLC_MediaPlayer_SetHwnd && mp && hWnd )
{
pLibVLC_MediaPlayer_SetHwnd( mp, (void *)hWnd );
}
}
/* ============================================================
Enlaces Harbour ↔ libVLC para controlar MediaPlayer
============================================================ */
HB_FUNC( VLC_MEDIAPLAYERSETMEDIA )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
void *pMedia = ( void * ) ( HB_PTRUINT ) hb_parnll( 2 );
if( pLibVLC_MediaPlayer_Set_Media != NULL && pMediaPlayer && pMedia )
pLibVLC_MediaPlayer_Set_Media( pMediaPlayer, pMedia );
}
HB_FUNC( VLC_MEDIAPLAYERPLAY )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
if( pLibVLC_MediaPlayer_Play != NULL && pMediaPlayer )
hb_retni( pLibVLC_MediaPlayer_Play( pMediaPlayer ) );
else
hb_retni( -1 );
}
// --- Pausa la reproducción ---
HB_FUNC( VLC_MEDIAPLAYERPAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pPause = GetProcAddress(hVlc, "libvlc_media_player_pause");
if( pPause && mp )
((void (__cdecl *)(void *))pPause)(mp);
}
// --- Verifica si está reproduciendo ---
HB_FUNC( VLC_MEDIAPLAYERISPLAYING )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pIsPlaying = GetProcAddress(hVlc, "libvlc_media_player_is_playing");
hb_retni( (pIsPlaying && mp) ? ((int (__cdecl *)(void *))pIsPlaying)(mp) : 0 );
}
// --- Ajusta el volumen ---
HB_FUNC( VLC_AUDIOSETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int vol = hb_parni(2);
FARPROC pSetVol = GetProcAddress(hVlc, "libvlc_audio_set_volume");
if( pSetVol && mp )
((void (__cdecl *)(void *, int))pSetVol)(mp, vol);
}
// --- Obtiene el volumen actual ---
HB_FUNC( VLC_AUDIOGETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetVol = GetProcAddress(hVlc, "libvlc_audio_get_volume");
hb_retni( (pGetVol && mp) ? ((int (__cdecl *)(void *))pGetVol)(mp) : -1 );
}
// --- Devuelve la duración total ---
HB_FUNC( VLC_MEDIAPLAYERGETLENGTH )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pLen = GetProcAddress(hVlc, "libvlc_media_player_get_length");
hb_retnll( (pLen && mp) ? ((libvlc_time_t (__cdecl *)(void *))pLen)(mp) : 0 );
}
// --- Cambia el tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERSETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
libvlc_time_t t = (libvlc_time_t)hb_parnll(2);
FARPROC pSetTime = GetProcAddress(hVlc, "libvlc_media_player_set_time");
if( pSetTime && mp )
((void (__cdecl *)(void *, libvlc_time_t))pSetTime)(mp, t);
}
// --- Cambia posición relativa (0.0–1.0) ---
HB_FUNC( VLC_MEDIAPLAYERSETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
float pos = (float)hb_parnd(2);
FARPROC pSetPos = GetProcAddress(hVlc, "libvlc_media_player_set_position");
if( pSetPos && mp )
((void (__cdecl *)(void *, float))pSetPos)(mp, pos);
}
// --- Obtiene posición relativa actual ---
HB_FUNC( VLC_MEDIAPLAYERGETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetPos = GetProcAddress(hVlc, "libvlc_media_player_get_position");
hb_retnd( (pGetPos && mp) ? ((float (__cdecl *)(void *))pGetPos)(mp) : 0.0 );
}
// --- Devuelve estado del reproductor ---
HB_FUNC( VLC_MEDIAPLAYERGETSTATE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetState = GetProcAddress(hVlc, "libvlc_media_player_get_state");
hb_retni( (pGetState && mp) ? ((int (__cdecl *)(void *))pGetState)(mp) : -1 );
}
#pragma ENDDUMP
Code: Select all
dumpbin /exports libvlc.dll | find "vlc_"Code: Select all
#pragma BEGINDUMP
#include "hbapi.h"
#include <windows.h>
#include <stdint.h> // para tipos enteros fijos
// --- Tipos básicos equivalentes ---
typedef int64_t libvlc_time_t;
// --- Funciones de libVLC ---
typedef void * (__cdecl *PFN_LIBVLC_NEW)(int, const char *const *);
typedef void (__cdecl *PFN_LIBVLC_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_PATH)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_RELEASE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PLAY)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_STOP)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SETHWND)(void *, void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_TIME)(void *);
static HMODULE hVlc = NULL;
static PFN_LIBVLC_NEW pLibVLC_New = NULL;
static PFN_LIBVLC_RELEASE pLibVLC_Release = NULL;
static PFN_LIBVLC_MEDIA_NEW_PATH pLibVLC_Media_New_Path = NULL;
static PFN_LIBVLC_MEDIA_RELEASE pLibVLC_Media_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW pLibVLC_MediaPlayer_New = NULL;
static PFN_LIBVLC_MEDIAPLAYER_RELEASE pLibVLC_MediaPlayer_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA pLibVLC_MediaPlayer_Set_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PLAY pLibVLC_MediaPlayer_Play = NULL;
static PFN_LIBVLC_MEDIAPLAYER_STOP pLibVLC_MediaPlayer_Stop = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_TIME pLibVLC_MediaPlayer_GetTime = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SETHWND pLibVLC_MediaPlayer_SetHwnd = NULL;
// --- Carga la DLL y obtiene punteros ---
HB_FUNC( VLC_LOADLIB )
{
const char * path = hb_parc( 1 );
hVlc = LoadLibraryA( path ? path : "libvlc.dll" );
if( !hVlc )
{
hb_retl( HB_FALSE );
return;
}
pLibVLC_New = (PFN_LIBVLC_NEW) GetProcAddress( hVlc, "libvlc_new" );
pLibVLC_Release = (PFN_LIBVLC_RELEASE) GetProcAddress( hVlc, "libvlc_release" );
pLibVLC_Media_New_Path = (PFN_LIBVLC_MEDIA_NEW_PATH) GetProcAddress( hVlc, "libvlc_media_new_path" );
pLibVLC_Media_Release = (PFN_LIBVLC_MEDIA_RELEASE) GetProcAddress( hVlc, "libvlc_media_release" );
pLibVLC_MediaPlayer_New = (PFN_LIBVLC_MEDIAPLAYER_NEW) GetProcAddress( hVlc, "libvlc_media_player_new" );
pLibVLC_MediaPlayer_Release = (PFN_LIBVLC_MEDIAPLAYER_RELEASE) GetProcAddress( hVlc, "libvlc_media_player_release" );
pLibVLC_MediaPlayer_Set_Media = (PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_set_media" );
pLibVLC_MediaPlayer_Play = (PFN_LIBVLC_MEDIAPLAYER_PLAY) GetProcAddress( hVlc, "libvlc_media_player_play" );
pLibVLC_MediaPlayer_Stop = (PFN_LIBVLC_MEDIAPLAYER_STOP) GetProcAddress( hVlc, "libvlc_media_player_stop" );
pLibVLC_MediaPlayer_GetTime = (PFN_LIBVLC_MEDIAPLAYER_GET_TIME) GetProcAddress( hVlc, "libvlc_media_player_get_time" );
hb_retl( pLibVLC_New != NULL );
}
// --- Libera la DLL ---
HB_FUNC( VLC_UNLOADLIB )
{
if( hVlc )
{
FreeLibrary( hVlc );
hVlc = NULL;
}
}
// --- Obtiene dirección de símbolo ---
HB_FUNC( VLC_GETSYMBOLADDRESS )
{
const char * name = hb_parc(1);
FARPROC addr = NULL;
if( hVlc && name )
addr = GetProcAddress( hVlc, name );
hb_retnll( (HB_LONGLONG)(LONG_PTR) addr );
}
// --- Crea una instancia de VLC ---
HB_FUNC( VLC_NEW )
{
void *inst = NULL;
if( pLibVLC_New )
inst = pLibVLC_New( 0, NULL );
hb_retnll( (HB_LONGLONG)(LONG_PTR) inst );
}
// --- Libera instancia ---
HB_FUNC( VLC_RELEASE )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_Release && inst )
pLibVLC_Release( inst );
}
// --- Reproduce un archivo ---
HB_FUNC( VLC_PLAYPATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
void *media = NULL;
void *mp = NULL;
if( !inst || !path || !pLibVLC_Media_New_Path )
{
hb_retnll(0);
return;
}
media = pLibVLC_Media_New_Path( inst, path );
mp = pLibVLC_MediaPlayer_New( inst );
if( media && mp )
{
pLibVLC_MediaPlayer_Set_Media( mp, media );
pLibVLC_Media_Release( media );
pLibVLC_MediaPlayer_Play( mp );
}
hb_retnll( (HB_LONGLONG)(LONG_PTR) mp );
}
// --- Devuelve tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERGETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_GetTime && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_GetTime( mp ) : 0 );
}
// --- Detiene reproducción ---
HB_FUNC( VLC_MEDIAPLAYERSTOP )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Stop && mp )
pLibVLC_MediaPlayer_Stop( mp );
}
// --- Libera reproductor ---
HB_FUNC( VLC_MEDIAPLAYERRELEASE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Release && mp )
pLibVLC_MediaPlayer_Release( mp );
}
// --- Asocia la ventana de reproducción (HWND) ---
// Permite reproducir el video dentro de un control HMG (ej. FrameVideo)
HB_FUNC( VLC_MEDIAPLAYERSETHWND )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1); // MediaPlayer
HWND hWnd = (HWND)(LONG_PTR) hb_parnll(2); // Handle de control HMG
if( pLibVLC_MediaPlayer_SetHwnd == NULL && hVlc )
{
// obtener dirección si no se cargó aún
pLibVLC_MediaPlayer_SetHwnd = (PFN_LIBVLC_MEDIAPLAYER_SETHWND)
GetProcAddress( hVlc, "libvlc_media_player_set_hwnd" );
}
if( pLibVLC_MediaPlayer_SetHwnd && mp && hWnd )
{
pLibVLC_MediaPlayer_SetHwnd( mp, (void *)hWnd );
}
}
/* ============================================================
Enlaces Harbour ↔ libVLC para controlar MediaPlayer
============================================================ */
HB_FUNC( VLC_MEDIAPLAYERSETMEDIA )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
void *pMedia = ( void * ) ( HB_PTRUINT ) hb_parnll( 2 );
if( pLibVLC_MediaPlayer_Set_Media != NULL && pMediaPlayer && pMedia )
pLibVLC_MediaPlayer_Set_Media( pMediaPlayer, pMedia );
}
HB_FUNC( VLC_MEDIAPLAYERPLAY )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
if( pLibVLC_MediaPlayer_Play != NULL && pMediaPlayer )
hb_retni( pLibVLC_MediaPlayer_Play( pMediaPlayer ) );
else
hb_retni( -1 );
}
// --- Pausa la reproducción ---
HB_FUNC( VLC_MEDIAPLAYERPAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pPause = GetProcAddress(hVlc, "libvlc_media_player_pause");
if( pPause && mp )
((void (__cdecl *)(void *))pPause)(mp);
}
// --- Verifica si está reproduciendo ---
HB_FUNC( VLC_MEDIAPLAYERISPLAYING )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pIsPlaying = GetProcAddress(hVlc, "libvlc_media_player_is_playing");
hb_retni( (pIsPlaying && mp) ? ((int (__cdecl *)(void *))pIsPlaying)(mp) : 0 );
}
// --- Ajusta el volumen ---
HB_FUNC( VLC_AUDIOSETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int vol = hb_parni(2);
FARPROC pSetVol = GetProcAddress(hVlc, "libvlc_audio_set_volume");
if( pSetVol && mp )
((void (__cdecl *)(void *, int))pSetVol)(mp, vol);
}
// --- Obtiene el volumen actual ---
HB_FUNC( VLC_AUDIOGETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetVol = GetProcAddress(hVlc, "libvlc_audio_get_volume");
hb_retni( (pGetVol && mp) ? ((int (__cdecl *)(void *))pGetVol)(mp) : -1 );
}
// --- Devuelve la duración total ---
HB_FUNC( VLC_MEDIAPLAYERGETLENGTH )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pLen = GetProcAddress(hVlc, "libvlc_media_player_get_length");
hb_retnll( (pLen && mp) ? ((libvlc_time_t (__cdecl *)(void *))pLen)(mp) : 0 );
}
// --- Cambia el tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERSETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
libvlc_time_t t = (libvlc_time_t)hb_parnll(2);
FARPROC pSetTime = GetProcAddress(hVlc, "libvlc_media_player_set_time");
if( pSetTime && mp )
((void (__cdecl *)(void *, libvlc_time_t))pSetTime)(mp, t);
}
// --- Cambia posición relativa (0.0–1.0) ---
HB_FUNC( VLC_MEDIAPLAYERSETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
float pos = (float)hb_parnd(2);
FARPROC pSetPos = GetProcAddress(hVlc, "libvlc_media_player_set_position");
if( pSetPos && mp )
((void (__cdecl *)(void *, float))pSetPos)(mp, pos);
}
// --- Obtiene posición relativa actual ---
HB_FUNC( VLC_MEDIAPLAYERGETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetPos = GetProcAddress(hVlc, "libvlc_media_player_get_position");
hb_retnd( (pGetPos && mp) ? ((float (__cdecl *)(void *))pGetPos)(mp) : 0.0 );
}
// --- Devuelve estado del reproductor ---
HB_FUNC( VLC_MEDIAPLAYERGETSTATE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetState = GetProcAddress(hVlc, "libvlc_media_player_get_state");
hb_retni( (pGetState && mp) ? ((int (__cdecl *)(void *))pGetState)(mp) : -1 );
}
#pragma ENDDUMP
Code: Select all
#pragma BEGINDUMP
#include "hbapi.h"
#include <windows.h>
#include <stdint.h> // para tipos enteros fijos
#pragma GCC diagnostic ignored "-Wcast-function-type"
// --- Tipos básicos equivalentes ---
#if defined(_WIN64)
typedef int64_t libvlc_time_t; // 64 bits
#else
typedef int32_t libvlc_time_t; // 32 bits
#endif
// --- Funciones de libVLC ---
typedef void * (__cdecl *PFN_LIBVLC_NEW)(int, const char *const *);
typedef void (__cdecl *PFN_LIBVLC_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_PATH)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_RELEASE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PLAY)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_STOP)(void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_TIME)(void *);
//--- funciones agregadas el 21-10-2025
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_LOCATION)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_ADD_OPTION)(void *, const char *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW_FROM_MEDIA)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_HWND)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_IS_PLAYING)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PAUSE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_FULLSCREEN)(void *, int);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_STATE)(void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_LENGTH)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_TIME)(void *, libvlc_time_t);
typedef int (__cdecl *PFN_LIBVLC_AUDIO_GET_VOLUME)(void *);
typedef void (__cdecl *PFN_LIBVLC_AUDIO_SET_VOLUME)(void *, int);
static HMODULE hVlc = NULL;
static PFN_LIBVLC_NEW pLibVLC_New = NULL;
static PFN_LIBVLC_RELEASE pLibVLC_Release = NULL;
static PFN_LIBVLC_MEDIA_NEW_PATH pLibVLC_Media_New_Path = NULL;
static PFN_LIBVLC_MEDIA_RELEASE pLibVLC_Media_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW pLibVLC_MediaPlayer_New = NULL;
static PFN_LIBVLC_MEDIAPLAYER_RELEASE pLibVLC_MediaPlayer_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA pLibVLC_MediaPlayer_Set_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PLAY pLibVLC_MediaPlayer_Play = NULL;
static PFN_LIBVLC_MEDIAPLAYER_STOP pLibVLC_MediaPlayer_Stop = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_TIME pLibVLC_MediaPlayer_GetTime = NULL;
static PFN_LIBVLC_MEDIA_NEW_LOCATION pLibVLC_Media_New_Location = NULL;
static PFN_LIBVLC_MEDIA_ADD_OPTION pLibVLC_Media_Add_Option = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW_FROM_MEDIA pLibVLC_MediaPlayer_New_From_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_HWND pLibVLC_MediaPlayer_Set_Hwnd = NULL;
static PFN_LIBVLC_MEDIAPLAYER_IS_PLAYING pLibVLC_MediaPlayer_Is_Playing = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PAUSE pLibVLC_MediaPlayer_Pause = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_FULLSCREEN pLibVLC_MediaPlayer_Set_Fullscreen = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_STATE pLibVLC_MediaPlayer_Get_State = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_LENGTH pLibVLC_MediaPlayer_Get_Length = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_TIME pLibVLC_MediaPlayer_Set_Time = NULL;
static PFN_LIBVLC_AUDIO_GET_VOLUME pLibVLC_Audio_Get_Volume = NULL;
static PFN_LIBVLC_AUDIO_SET_VOLUME pLibVLC_Audio_Set_Volume = NULL;
// --- Carga la DLL y obtiene punteros ---
HB_FUNC( VLC_LOADLIB )
{
const char * path = hb_parc( 1 );
hVlc = LoadLibraryA( path ? path : "libvlc.dll" );
if( !hVlc )
{
hb_retl( HB_FALSE );
return;
}
pLibVLC_New = (PFN_LIBVLC_NEW) GetProcAddress( hVlc, "libvlc_new" );
pLibVLC_Release = (PFN_LIBVLC_RELEASE) GetProcAddress( hVlc, "libvlc_release" );
pLibVLC_Media_New_Path = (PFN_LIBVLC_MEDIA_NEW_PATH) GetProcAddress( hVlc, "libvlc_media_new_path" );
pLibVLC_Media_Release = (PFN_LIBVLC_MEDIA_RELEASE) GetProcAddress( hVlc, "libvlc_media_release" );
pLibVLC_MediaPlayer_New = (PFN_LIBVLC_MEDIAPLAYER_NEW) GetProcAddress( hVlc, "libvlc_media_player_new" );
pLibVLC_MediaPlayer_Release = (PFN_LIBVLC_MEDIAPLAYER_RELEASE) GetProcAddress( hVlc, "libvlc_media_player_release" );
pLibVLC_MediaPlayer_Set_Media = (PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_set_media" );
pLibVLC_MediaPlayer_Play = (PFN_LIBVLC_MEDIAPLAYER_PLAY) GetProcAddress( hVlc, "libvlc_media_player_play" );
pLibVLC_MediaPlayer_Stop = (PFN_LIBVLC_MEDIAPLAYER_STOP) GetProcAddress( hVlc, "libvlc_media_player_stop" );
pLibVLC_MediaPlayer_GetTime = (PFN_LIBVLC_MEDIAPLAYER_GET_TIME) GetProcAddress( hVlc, "libvlc_media_player_get_time" );
pLibVLC_Media_New_Location = (PFN_LIBVLC_MEDIA_NEW_LOCATION) GetProcAddress( hVlc, "libvlc_media_new_location" );
pLibVLC_Media_Add_Option = (PFN_LIBVLC_MEDIA_ADD_OPTION) GetProcAddress( hVlc, "libvlc_media_add_option" );
pLibVLC_MediaPlayer_New_From_Media = (PFN_LIBVLC_MEDIAPLAYER_NEW_FROM_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_new_from_media" );
pLibVLC_MediaPlayer_Set_Hwnd = (PFN_LIBVLC_MEDIAPLAYER_SET_HWND) GetProcAddress( hVlc, "libvlc_media_player_set_hwnd" );
pLibVLC_MediaPlayer_Is_Playing = (PFN_LIBVLC_MEDIAPLAYER_IS_PLAYING) GetProcAddress( hVlc, "libvlc_media_player_is_playing" );
pLibVLC_MediaPlayer_Pause = (PFN_LIBVLC_MEDIAPLAYER_PAUSE) GetProcAddress( hVlc, "libvlc_media_player_pause" );
pLibVLC_MediaPlayer_Set_Fullscreen = (PFN_LIBVLC_MEDIAPLAYER_SET_FULLSCREEN) GetProcAddress( hVlc, "libvlc_set_fullscreen" );
pLibVLC_MediaPlayer_Get_State = (PFN_LIBVLC_MEDIAPLAYER_GET_STATE) GetProcAddress( hVlc, "libvlc_media_player_get_state" );
pLibVLC_MediaPlayer_Get_Length = (PFN_LIBVLC_MEDIAPLAYER_GET_LENGTH) GetProcAddress( hVlc, "libvlc_media_player_get_length" );
pLibVLC_MediaPlayer_Set_Time = (PFN_LIBVLC_MEDIAPLAYER_SET_TIME) GetProcAddress( hVlc, "libvlc_media_player_set_time" );
pLibVLC_Audio_Get_Volume = (PFN_LIBVLC_AUDIO_GET_VOLUME) GetProcAddress( hVlc, "libvlc_audio_get_volume" );
pLibVLC_Audio_Set_Volume = (PFN_LIBVLC_AUDIO_SET_VOLUME) GetProcAddress( hVlc, "libvlc_audio_set_volume" );
hb_retl( pLibVLC_New != NULL );
}
// --- Libera la DLL ---
HB_FUNC( VLC_UNLOADLIB )
{
if( hVlc )
{
FreeLibrary( hVlc );
hVlc = NULL;
}
}
// --- Obtiene dirección de símbolo ---
HB_FUNC( VLC_GETSYMBOLADDRESS )
{
const char * name = hb_parc(1);
FARPROC addr = NULL;
if( hVlc && name )
addr = GetProcAddress( hVlc, name );
hb_retnll( (HB_LONGLONG)(LONG_PTR) addr );
}
// --- Crea una instancia de VLC ---
HB_FUNC( VLC_NEW )
{
void *inst = NULL;
if( pLibVLC_New )
inst = pLibVLC_New( 0, NULL );
hb_retnll( (HB_LONGLONG)(LONG_PTR) inst );
}
// --- Libera instancia ---
HB_FUNC( VLC_RELEASE )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_Release && inst )
pLibVLC_Release( inst );
}
// --- Reproduce un archivo ---
HB_FUNC( VLC_PLAYPATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
void *media = NULL;
void *mp = NULL;
if( !inst || !path || !pLibVLC_Media_New_Path )
{
hb_retnll(0);
return;
}
media = pLibVLC_Media_New_Path( inst, path );
mp = pLibVLC_MediaPlayer_New( inst );
if( media && mp )
{
pLibVLC_MediaPlayer_Set_Media( mp, media );
pLibVLC_Media_Release( media );
pLibVLC_MediaPlayer_Play( mp );
}
hb_retnll( (HB_LONGLONG)(LONG_PTR) mp );
}
// --- Devuelve tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERGETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_GetTime && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_GetTime( mp ) : 0 );
}
// --- Detiene reproducción ---
HB_FUNC( VLC_MEDIAPLAYERSTOP )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Stop && mp )
pLibVLC_MediaPlayer_Stop( mp );
}
// --- Libera reproductor ---
HB_FUNC( VLC_MEDIAPLAYERRELEASE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Release && mp )
pLibVLC_MediaPlayer_Release( mp );
}
HB_FUNC( VLC_MEDIA_NEW_LOCATION )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *url = hb_parc(2);
if( pLibVLC_Media_New_Location && inst && url )
hb_retnll( (HB_LONGLONG)(LONG_PTR) pLibVLC_Media_New_Location( inst, url ) );
else
hb_retnll( 0 );
}
HB_FUNC( VLC_MEDIA_ADD_OPTION )
{
void *media = (void *)(LONG_PTR) hb_parnll(1);
const char *opt = hb_parc(2);
if( pLibVLC_Media_Add_Option && media && opt )
pLibVLC_Media_Add_Option( media, opt );
}
HB_FUNC( VLC_MEDIAPLAYER_NEW_FROM_MEDIA )
{
void *media = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (HB_LONGLONG)(LONG_PTR)
(pLibVLC_MediaPlayer_New_From_Media && media ?
pLibVLC_MediaPlayer_New_From_Media( media ) : NULL) );
}
HB_FUNC( VLC_MEDIAPLAYERSETHWND )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
void *hwnd = (void *)(LONG_PTR) hb_parnll(2);
if( pLibVLC_MediaPlayer_Set_Hwnd && mp )
pLibVLC_MediaPlayer_Set_Hwnd( mp, hwnd );
}
HB_FUNC( VLC_MEDIAPLAYERPLAY )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Play && mp )
pLibVLC_MediaPlayer_Play( mp );
}
HB_FUNC( VLC_MEDIAPLAYERISPLAYING )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retl( (pLibVLC_MediaPlayer_Is_Playing && mp) ? pLibVLC_MediaPlayer_Is_Playing( mp ) != 0 : HB_FALSE );
}
HB_FUNC( VLC_PAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Pause && mp )
pLibVLC_MediaPlayer_Pause( mp );
}
HB_FUNC( VLC_MEDIAPLAYERGETSTATE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retni( (pLibVLC_MediaPlayer_Get_State && mp) ?
pLibVLC_MediaPlayer_Get_State( mp ) : -1 );
}
HB_FUNC( VLC_MEDIAPLAYERGETLENGTH )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_Get_Length && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_Get_Length( mp ) : 0 );
}
HB_FUNC( VLC_MEDIAPLAYERSETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
libvlc_time_t t = (libvlc_time_t) hb_parnll(2);
if( pLibVLC_MediaPlayer_Set_Time && mp )
pLibVLC_MediaPlayer_Set_Time( mp, t );
}
HB_FUNC( VLC_MEDIAPLAYERPAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Pause && mp )
pLibVLC_MediaPlayer_Pause( mp );
}
HB_FUNC( VLC_FULLSCREEN )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int enable = hb_parl(2);
if( pLibVLC_MediaPlayer_Set_Fullscreen && mp )
pLibVLC_MediaPlayer_Set_Fullscreen( mp, enable );
}
HB_FUNC( VLC_AUDIOGETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retni( (pLibVLC_Audio_Get_Volume && mp) ?
pLibVLC_Audio_Get_Volume( mp ) : -1 );
}
HB_FUNC( VLC_AUDIOSETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int vol = hb_parni(2);
if( pLibVLC_Audio_Set_Volume && mp )
pLibVLC_Audio_Set_Volume( mp, vol );
}
HB_FUNC( VLC_MEDIA_NEW_PATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
if( pLibVLC_Media_New_Path && inst && path )
hb_retnll( (HB_LONGLONG)(LONG_PTR) pLibVLC_Media_New_Path( inst, path ) );
else
hb_retnll( 0 );
}
#pragma ENDDUMP
Code: Select all
#pragma BEGINDUMP
#include "hbapi.h"
#include <windows.h>
#include <stdint.h> // para tipos enteros fijos
#pragma GCC diagnostic ignored "-Wcast-function-type"
// --- Tipos básicos equivalentes ---
#if defined(_WIN64)
typedef int64_t libvlc_time_t; // 64 bits
#else
typedef int32_t libvlc_time_t; // 32 bits
#endif
// --- Funciones de libVLC ---
typedef void * (__cdecl *PFN_LIBVLC_NEW)(int, const char *const *);
typedef void (__cdecl *PFN_LIBVLC_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_PATH)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_RELEASE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PLAY)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_STOP)(void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_TIME)(void *);
//--- funciones agregadas el 21-10-2025
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_LOCATION)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_ADD_OPTION)(void *, const char *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW_FROM_MEDIA)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_HWND)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_IS_PLAYING)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PAUSE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_FULLSCREEN)(void *, int);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_STATE)(void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_LENGTH)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_TIME)(void *, libvlc_time_t);
typedef int (__cdecl *PFN_LIBVLC_AUDIO_GET_VOLUME)(void *);
typedef void (__cdecl *PFN_LIBVLC_AUDIO_SET_VOLUME)(void *, int);
static HMODULE hVlc = NULL;
static PFN_LIBVLC_NEW pLibVLC_New = NULL;
static PFN_LIBVLC_RELEASE pLibVLC_Release = NULL;
static PFN_LIBVLC_MEDIA_NEW_PATH pLibVLC_Media_New_Path = NULL;
static PFN_LIBVLC_MEDIA_RELEASE pLibVLC_Media_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW pLibVLC_MediaPlayer_New = NULL;
static PFN_LIBVLC_MEDIAPLAYER_RELEASE pLibVLC_MediaPlayer_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA pLibVLC_MediaPlayer_Set_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PLAY pLibVLC_MediaPlayer_Play = NULL;
static PFN_LIBVLC_MEDIAPLAYER_STOP pLibVLC_MediaPlayer_Stop = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_TIME pLibVLC_MediaPlayer_GetTime = NULL;
static PFN_LIBVLC_MEDIA_NEW_LOCATION pLibVLC_Media_New_Location = NULL;
static PFN_LIBVLC_MEDIA_ADD_OPTION pLibVLC_Media_Add_Option = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW_FROM_MEDIA pLibVLC_MediaPlayer_New_From_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_HWND pLibVLC_MediaPlayer_Set_Hwnd = NULL;
static PFN_LIBVLC_MEDIAPLAYER_IS_PLAYING pLibVLC_MediaPlayer_Is_Playing = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PAUSE pLibVLC_MediaPlayer_Pause = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_FULLSCREEN pLibVLC_MediaPlayer_Set_Fullscreen = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_STATE pLibVLC_MediaPlayer_Get_State = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_LENGTH pLibVLC_MediaPlayer_Get_Length = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_TIME pLibVLC_MediaPlayer_Set_Time = NULL;
static PFN_LIBVLC_AUDIO_GET_VOLUME pLibVLC_Audio_Get_Volume = NULL;
static PFN_LIBVLC_AUDIO_SET_VOLUME pLibVLC_Audio_Set_Volume = NULL;
// --- Carga la DLL y obtiene punteros ---
HB_FUNC( VLC_LOADLIB )
{
const char * path = hb_parc( 1 );
hVlc = LoadLibraryA( path ? path : "libvlc.dll" );
if( !hVlc )
{
hb_retl( HB_FALSE );
return;
}
pLibVLC_New = (PFN_LIBVLC_NEW) GetProcAddress( hVlc, "libvlc_new" );
pLibVLC_Release = (PFN_LIBVLC_RELEASE) GetProcAddress( hVlc, "libvlc_release" );
pLibVLC_Media_New_Path = (PFN_LIBVLC_MEDIA_NEW_PATH) GetProcAddress( hVlc, "libvlc_media_new_path" );
pLibVLC_Media_Release = (PFN_LIBVLC_MEDIA_RELEASE) GetProcAddress( hVlc, "libvlc_media_release" );
pLibVLC_MediaPlayer_New = (PFN_LIBVLC_MEDIAPLAYER_NEW) GetProcAddress( hVlc, "libvlc_media_player_new" );
pLibVLC_MediaPlayer_Release = (PFN_LIBVLC_MEDIAPLAYER_RELEASE) GetProcAddress( hVlc, "libvlc_media_player_release" );
pLibVLC_MediaPlayer_Set_Media = (PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_set_media" );
pLibVLC_MediaPlayer_Play = (PFN_LIBVLC_MEDIAPLAYER_PLAY) GetProcAddress( hVlc, "libvlc_media_player_play" );
pLibVLC_MediaPlayer_Stop = (PFN_LIBVLC_MEDIAPLAYER_STOP) GetProcAddress( hVlc, "libvlc_media_player_stop" );
pLibVLC_MediaPlayer_GetTime = (PFN_LIBVLC_MEDIAPLAYER_GET_TIME) GetProcAddress( hVlc, "libvlc_media_player_get_time" );
pLibVLC_Media_New_Location = (PFN_LIBVLC_MEDIA_NEW_LOCATION) GetProcAddress( hVlc, "libvlc_media_new_location" );
pLibVLC_Media_Add_Option = (PFN_LIBVLC_MEDIA_ADD_OPTION) GetProcAddress( hVlc, "libvlc_media_add_option" );
pLibVLC_MediaPlayer_New_From_Media = (PFN_LIBVLC_MEDIAPLAYER_NEW_FROM_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_new_from_media" );
pLibVLC_MediaPlayer_Set_Hwnd = (PFN_LIBVLC_MEDIAPLAYER_SET_HWND) GetProcAddress( hVlc, "libvlc_media_player_set_hwnd" );
pLibVLC_MediaPlayer_Is_Playing = (PFN_LIBVLC_MEDIAPLAYER_IS_PLAYING) GetProcAddress( hVlc, "libvlc_media_player_is_playing" );
pLibVLC_MediaPlayer_Pause = (PFN_LIBVLC_MEDIAPLAYER_PAUSE) GetProcAddress( hVlc, "libvlc_media_player_pause" );
pLibVLC_MediaPlayer_Set_Fullscreen = (PFN_LIBVLC_MEDIAPLAYER_SET_FULLSCREEN) GetProcAddress( hVlc, "libvlc_set_fullscreen" );
pLibVLC_MediaPlayer_Get_State = (PFN_LIBVLC_MEDIAPLAYER_GET_STATE) GetProcAddress( hVlc, "libvlc_media_player_get_state" );
pLibVLC_MediaPlayer_Get_Length = (PFN_LIBVLC_MEDIAPLAYER_GET_LENGTH) GetProcAddress( hVlc, "libvlc_media_player_get_length" );
pLibVLC_MediaPlayer_Set_Time = (PFN_LIBVLC_MEDIAPLAYER_SET_TIME) GetProcAddress( hVlc, "libvlc_media_player_set_time" );
pLibVLC_Audio_Get_Volume = (PFN_LIBVLC_AUDIO_GET_VOLUME) GetProcAddress( hVlc, "libvlc_audio_get_volume" );
pLibVLC_Audio_Set_Volume = (PFN_LIBVLC_AUDIO_SET_VOLUME) GetProcAddress( hVlc, "libvlc_audio_set_volume" );
hb_retl( pLibVLC_New != NULL );
}
// --- Libera la DLL ---
HB_FUNC( VLC_UNLOADLIB )
{
if( hVlc )
{
FreeLibrary( hVlc );
hVlc = NULL;
}
}
// --- Obtiene dirección de símbolo ---
HB_FUNC( VLC_GETSYMBOLADDRESS )
{
const char * name = hb_parc(1);
FARPROC addr = NULL;
if( hVlc && name )
addr = GetProcAddress( hVlc, name );
hb_retnll( (HB_LONGLONG)(LONG_PTR) addr );
}
// --- Crea una instancia de VLC ---
HB_FUNC( VLC_NEW )
{
void *inst = NULL;
if( pLibVLC_New )
inst = pLibVLC_New( 0, NULL );
hb_retnll( (HB_LONGLONG)(LONG_PTR) inst );
}
// --- Libera instancia ---
HB_FUNC( VLC_RELEASE )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_Release && inst )
pLibVLC_Release( inst );
}
// --- Reproduce un archivo ---
HB_FUNC( VLC_PLAYPATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
void *media = NULL;
void *mp = NULL;
if( !inst || !path || !pLibVLC_Media_New_Path )
{
hb_retnll(0);
return;
}
media = pLibVLC_Media_New_Path( inst, path );
mp = pLibVLC_MediaPlayer_New( inst );
if( media && mp )
{
pLibVLC_MediaPlayer_Set_Media( mp, media );
pLibVLC_Media_Release( media );
pLibVLC_MediaPlayer_Play( mp );
}
hb_retnll( (HB_LONGLONG)(LONG_PTR) mp );
}
// --- Devuelve tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERGETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_GetTime && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_GetTime( mp ) : 0 );
}
// --- Detiene reproducción ---
HB_FUNC( VLC_MEDIAPLAYERSTOP )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Stop && mp )
pLibVLC_MediaPlayer_Stop( mp );
}
// --- Libera reproductor ---
HB_FUNC( VLC_MEDIAPLAYERRELEASE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Release && mp )
pLibVLC_MediaPlayer_Release( mp );
}
HB_FUNC( VLC_MEDIA_NEW_LOCATION )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *url = hb_parc(2);
if( pLibVLC_Media_New_Location && inst && url )
hb_retnll( (HB_LONGLONG)(LONG_PTR) pLibVLC_Media_New_Location( inst, url ) );
else
hb_retnll( 0 );
}
HB_FUNC( VLC_MEDIA_ADD_OPTION )
{
void *media = (void *)(LONG_PTR) hb_parnll(1);
const char *opt = hb_parc(2);
if( pLibVLC_Media_Add_Option && media && opt )
pLibVLC_Media_Add_Option( media, opt );
}
HB_FUNC( VLC_MEDIAPLAYER_NEW_FROM_MEDIA )
{
void *media = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (HB_LONGLONG)(LONG_PTR)
(pLibVLC_MediaPlayer_New_From_Media && media ?
pLibVLC_MediaPlayer_New_From_Media( media ) : NULL) );
}
HB_FUNC( VLC_MEDIAPLAYERSETHWND )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
void *hwnd = (void *)(LONG_PTR) hb_parnll(2);
if( pLibVLC_MediaPlayer_Set_Hwnd && mp )
pLibVLC_MediaPlayer_Set_Hwnd( mp, hwnd );
}
HB_FUNC( VLC_MEDIAPLAYERPLAY )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Play && mp )
pLibVLC_MediaPlayer_Play( mp );
}
HB_FUNC( VLC_MEDIAPLAYERISPLAYING )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retl( (pLibVLC_MediaPlayer_Is_Playing && mp) ? pLibVLC_MediaPlayer_Is_Playing( mp ) != 0 : HB_FALSE );
}
HB_FUNC( VLC_PAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Pause && mp )
pLibVLC_MediaPlayer_Pause( mp );
}
HB_FUNC( VLC_MEDIAPLAYERGETSTATE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retni( (pLibVLC_MediaPlayer_Get_State && mp) ?
pLibVLC_MediaPlayer_Get_State( mp ) : -1 );
}
HB_FUNC( VLC_MEDIAPLAYERGETLENGTH )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_Get_Length && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_Get_Length( mp ) : 0 );
}
HB_FUNC( VLC_MEDIAPLAYERSETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
libvlc_time_t t = (libvlc_time_t) hb_parnll(2);
if( pLibVLC_MediaPlayer_Set_Time && mp )
pLibVLC_MediaPlayer_Set_Time( mp, t );
}
HB_FUNC( VLC_MEDIAPLAYERPAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Pause && mp )
pLibVLC_MediaPlayer_Pause( mp );
}
HB_FUNC( VLC_FULLSCREEN )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int enable = hb_parl(2);
if( pLibVLC_MediaPlayer_Set_Fullscreen && mp )
pLibVLC_MediaPlayer_Set_Fullscreen( mp, enable );
}
HB_FUNC( VLC_AUDIOGETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retni( (pLibVLC_Audio_Get_Volume && mp) ?
pLibVLC_Audio_Get_Volume( mp ) : -1 );
}
HB_FUNC( VLC_AUDIOSETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int vol = hb_parni(2);
if( pLibVLC_Audio_Set_Volume && mp )
pLibVLC_Audio_Set_Volume( mp, vol );
}
HB_FUNC( VLC_MEDIA_NEW_PATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
if( pLibVLC_Media_New_Path && inst && path )
hb_retnll( (HB_LONGLONG)(LONG_PTR) pLibVLC_Media_New_Path( inst, path ) );
else
hb_retnll( 0 );
}
#pragma ENDDUMP
Attachments
Attachments
Finally add in the test.hbc file the next libraries
Finally add in the test.hbc file the next libraries
Attachments
Attachments