Page 1 of 1

Libvlc.dll Working

Posted: Mon Oct 20, 2025 7:44 pm
by danielmaximiliano
Hola a Todos :
despues de 2 semanas luchando con hb_LibLoad("libvlc.dll") en 64 bits y que sus funciones den error , intentar con crear librerias estaticas "libvlc.a" teniendo el mismo resultado...no funciona. :(

usando ChatGPT pedi que me ayudara a usar libvlc con hb_libload sin ningun resulto con todos los ejemplos simples compilando Harbour 64 + Mingw 64 que se encuentra en la instalacion HMG 64.. todo sin resultado alguno..

procedí pedirle que que me hiciera un simple con de hb_loadlib() y entrego como resultado vlc_loadlib() que me devuelve correctamente todos los punteros de las funciones exportadas de libvlc.dll :D .

al hacer vemos las funciones

Code: Select all

dumpbin /exports libvlc.dll | find "vlc_"
como ya tenia lo principal fue pedirle que me diga como usar esas funciones para poder usarla en el proyecto Camara que estoy implementando con el IDE de HMG y me da el resultado que agregue al Main.prg dentro del bloque

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

ya contento con el funcioanamiento correcto de libvlc voy a seguir con recuperar el video que esta encapsulado en RSP (todavia lo estoy implementado) , si quieren ver el proyecto lo voy a subir a Drive en un momento y compartirlo con uds para agegrar nuevas funciones

Re: Libvlc.dll Working

Posted: Mon Oct 20, 2025 7:51 pm
by danielmaximiliano

Re: Libvlc.dll Working

Posted: Wed Oct 22, 2025 3:19 am
by luisvasquezcl
Hola Daniel,
Muchas gracias por tu aporte.
Saludos desde chile.

Re: Libvlc.dll Working

Posted: Wed Oct 22, 2025 3:48 am
by danielmaximiliano
luisvasquezcl wrote: Wed Oct 22, 2025 3:19 am Hola Daniel,
Muchas gracias por tu aporte.
Saludos desde chile.
gracias, era una necesidad que tenia ya que el programa de windows de esa camara es muy pobre, solo me deja ver una a la vez, ahora que mejore todo puedo ver las 2 camaras en un solo contenedor.. la app de android es mucho mejor pero sigue viendo solo una camara y necesito salir para ver la otra.. quiero llegar a hacer un DVR donde me permita ver varias simultaneamente.

Re: Libvlc.dll Working

Posted: Wed Oct 22, 2025 3:51 am
by danielmaximiliano
nueva mejoras, poder ver un archivo local con browse o dando una url, se agregó la documentacion dentro del programa como si fuera un label ya que tengo que aprender sobre HiperLink :?

Enlace a Driver : https://drive.google.com/drive/folders/ ... sp=sharing

Re: Libvlc.dll Working

Posted: Wed Oct 22, 2025 1:55 pm
by danielmaximiliano
hola a todos, dejo version de bridge_vlc nuevo que reemplaza al anterior.
la modificacion corresponde a compilar en modo 32 o 64bits en el ide. la condicion es que libvcl.dll o libvlccore.dll esten en la carpeta del ejecutable y sea de de vlc32 o vcl64

.\Source\vlc_bridge.Prg

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