Duracion de un mp3 ( SOLUCIONADO )

Duracion de un mp3 ( SOLUCIONADO )

Postby cuatecatl82 » Fri Nov 20, 2015 10:23 pm

Colegas del foro buenas tardes:

Ando trabajando en un proyecto para reproducir varios mp3 de forma casi simultanea, por el momento puedo hacer que se escuche cada pista en base a un boton asociado, tambien se como detener la reproducción, el detalle esta en que necesito saber que tiempo dura cada pista o si el archivo que estaba sonando ya termino para que el boton al que esta asociado cambie el bitmap.. les dejo una imagen para que se den una idea de lo que les comento..

Image

Mi idea es hacer que el boton que lanzo el sonido cambie el bitmap de "PLAY" a "STOP" pero, al finalizar la reproduccion recupere el bitmap de "PLAY"..

Con respecto al comando mciSendStr me ha dado uno que otro error, invenstigando sobre dicho comando se que cada pista debe tener un "Alias" para identificar que pista esta sonando, mi pregunta es si es correcto hacer esto:
Code: Select all  Expand view

mciSendStr("STOP MP3"+aAlias,0, oWnd:hWnd)
mciSendStr("CLOSE MP3"+aAlias,0, oWnd:hWnd)
mciSendStr( "OPEN " + LFN2SFN(cFile) + " TYPE MPEGVIDEO ALIAS MP3"+aAlias,, oWnd:hWnd )
mciSendStr( "PLAY MP3"+aAlias,0, oWnd:hWnd )


Pd. les dejo los fuentes y el exe para que puedan probarlo y ver lo que necesito..

http://www.mediafire.com/download/dm2s8bpyj2hmyl7/samplers.zip

En ocaciones me tira un error y me crea este archivo hb_out.log

Application Internal Error - Z:\Pruebas\Payaso\Samplers.Exe
Terminated at: 2015-11-20 16:47:36
Error irrecuperable 6005: Exception error:

Exception Code:C0000005 ACCESS_VIOLATION
Exception Address:10137737
EAX:01A3FC9C EBX:00000000 ECX:00000001 EDX:00000000
ESI:10137737 EDI:001B1FA0 EBP:01A3FCCC
CS:EIP:001B:10137737 SS:ESP:0023:01A3FC84
DS:0023 ES:0023 FS:003B GS:0000
Flags:00010246
Exception Parameters: 00000000 10137737
CS:EIP:
SS:ESP: 7C937E71 001B1FA0 00000000 001C4DE0 01A3FD14 00000000 00000014 00000001 00000000 00000000 00000010 01A3FE48 01A3FC90 01A3F8A8 01A3FFDC 7C91E900

C stack:
EIP: EBP: Frame: OldEBP, RetAddr, Params...
10137737 01A3FCCC 01A3FCF8 7C939D7C 10137737 001B1FA0 00000000 00000000 00000000 00000001 00000000 01A3FCEC
7C939D7C 01A3FCF8 01A3FFB4 7C939CCA 001C4DE0 00000006 00000020 00000018 00000000 7C98C980 7C98C980 00000204
7C939CCA 01A3FFB4 01A3FFEC 7C80B713 00000000 00000020 00000018 00000000 7FFD7000 C0000005 01A3FFC0 01A3F8A8


Modules:
00400000 00376000 Z:\Pruebas\Payaso\Samplers.Exe
7C910000 000B5000 C:\WINDOWS\system32\ntdll.dll
7C800000 00103000 C:\WINDOWS\system32\kernel32.dll
77DA0000 000AC000 C:\WINDOWS\system32\ADVAPI32.DLL
77E50000 00092000 C:\WINDOWS\system32\RPCRT4.dll
77FC0000 00011000 C:\WINDOWS\system32\Secur32.dll
72F80000 00026000 C:\WINDOWS\system32\WINSPOOL.DRV
77EF0000 00049000 C:\WINDOWS\system32\GDI32.dll
7E390000 00091000 C:\WINDOWS\system32\USER32.dll
77BE0000 00058000 C:\WINDOWS\system32\msvcrt.dll
773A0000 00103000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\COMCTL32.DLL
77F40000 00076000 C:\WINDOWS\system32\SHLWAPI.dll
76360000 0004A000 C:\WINDOWS\system32\COMDLG32.DLL
7E6A0000 00821000 C:\WINDOWS\system32\SHELL32.dll
76330000 00005000 C:\WINDOWS\system32\MSIMG32.DLL
76B00000 0002E000 C:\WINDOWS\system32\WINMM.DLL
774B0000 0013D000 C:\WINDOWS\system32\OLE32.DLL
770F0000 0008B000 C:\WINDOWS\system32\OLEAUT32.DLL
4EBA0000 001A6000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.5512_x-ww_dfb54e0c\GDIPLUS.DLL
5B150000 00038000 C:\WINDOWS\system32\UxTheme.dll
72CA0000 00009000 C:\WINDOWS\system32\wdmaud.drv
76BF0000 0002E000 C:\WINDOWS\system32\WINTRUST.dll
77A50000 00096000 C:\WINDOWS\system32\CRYPT32.dll
77Application Internal Error - Z:\Pruebas\Payaso\Samplers.Exe
Terminated at: 2015-11-20 16:48:39
Error irrecuperable 6005: Exception error:

Exception Code:C0000005 ACCESS_VIOLATION
Exception Address:10137737
EAX:01A3FC9C EBX:00000000 ECX:00000001 EDX:00000000
ESI:10137737 EDI:001C6D80 EBP:01A3FCCC
CS:EIP:001B:10137737 SS:ESP:0023:01A3FC84
DS:0023 ES:0023 FS:003B GS:0000
Flags:00010246
Exception Parameters: 00000000 10137737
CS:EIP:
SS:ESP: 7C937E71 001C6D80 00000000 01AD7E78 01A3FD14 00000000 00000014 00000001 00000000 00000000 00000010 01A3FEF0 01A3FC90 01A3F8A8 01A3FFDC 7C91E900

C stack:
EIP: EBP: Frame: OldEBP, RetAddr, Params...
10137737 01A3FCCC 01A3FCF8 7C939D7C 10137737 001C6D80 00000000 00000000 00000000 00000001 00000000 01A3FCEC
7C939D7C 01A3FCF8 01A3FFB4 7C939CCA 01AD7E78 00000030 00000020 00000018 00000000 7C98C980 7C98C980 00000204
7C939CCA 01A3FFB4 01A3FFEC 7C80B713 00000000 00000020 00000018 00000000 7FFD7000 C0000005 01A3FFC0 01A3F8A8


Modules:
00400000 00376000 Z:\Pruebas\Payaso\Samplers.Exe
7C910000 000B5000 C:\WINDOWS\system32\ntdll.dll
7C800000 00103000 C:\WINDOWS\system32\kernel32.dll
77DA0000 000AC000 C:\WINDOWS\system32\ADVAPI32.DLL
77E50000 00092000 C:\WINDOWS\system32\RPCRT4.dll
77FC0000 00011000 C:\WINDOWS\system32\Secur32.dll
72F80000 00026000 C:\WINDOWS\system32\WINSPOOL.DRV
77EF0000 00049000 C:\WINDOWS\system32\GDI32.dll
7E390000 00091000 C:\WINDOWS\system32\USER32.dll
77BE0000 00058000 C:\WINDOWS\system32\msvcrt.dll
773A0000 00103000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\COMCTL32.DLL
77F40000 00076000 C:\WINDOWS\system32\SHLWAPI.dll
76360000 0004A000 C:\WINDOWS\system32\COMDLG32.DLL
7E6A0000 00821000 C:\WINDOWS\system32\SHELL32.dll
76330000 00005000 C:\WINDOWS\system32\MSIMG32.DLL
76B00000 0002E000 C:\WINDOWS\system32\WINMM.DLL
774B0000 0013D000 C:\WINDOWS\system32\OLE32.DLL
770F0000 0008B000 C:\WINDOWS\system32\OLEAUT32.DLL
4EBA0000 001A6000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.5512_x-ww_dfb54e0c\GDIPLUS.DLL
5B150000 00038000 C:\WINDOWS\system32\UxTheme.dll
72CA0000 00009000 C:\WINDOWS\system32\wdmaud.drv
76BF0000 0002E000 C:\WINDOWS\system32\WINTRUST.dll
77A50000 00096000 C:\WINDOWS\system32\CRYPT32.dll
77AF0000 00012000 C:\WINDOWS\system32\MSASN1.dll
76C50000 00028000 C:\WINDOWS\system32\IMAGEHLP.dll
72C90000 00008000 C:\WINDOWS\system32\msacm32.drv
77BB0000 00015000 C:\WINDOWS\system32\MSACM32.dll
77BA0000 00007000 C:\WINDOWS\system32\midimap.dll
76F90000 0007F000 C:\WINDOWS\system32\CLBCATQ.DLL
77010000 000D0000 C:\WINDOWS\system32\COMRes.dll
77BD0000 00008000 C:\WINDOWS\system32\VERSION.dll
73E90000 0005C000 C:\WINDOWS\system32\DSOUND.DLL
73E60000 00004000 C:\WINDOWS\system32\KsUser.dll

Called from SYSREFRESH(0)
Called from BTNPLAYSND(449) in Luis.prg
Called from BTNPLAYSND(449) in Luis.prg
Called from TBUTTONBMP:CLICK(176) in .\source\classes\BUTTON.PRG
Called from TBUTTONBMP:CLICK(176) in .\source\classes\BUTTON.PRG
Called from TBUTTONBMP:HANDLEEVENT(214) in .\source\classes\BUTTONB.PRG
Called from _FWH(3553) in .\source\classes\WINDOW.PRG
Called from SENDMESSAGE(0)
Called from TDIALOG:COMMAND(413) in .\source\classes\DIALOG.PRG
Called from TDIALOG:COMMAND(413) in .\source\classes\DIALOG.PRG
Called from TWINDOW:HANDLEEVENT(0)
Called from TDIALOG:HANDLEEVENT(905) in .\source\classes\DIALOG.PRG
Called from _FWH(3553) in .\source\classes\WINDOW.PRG
Called from DIALOGBOX(0)
Called from TDIALOG:ACTIVATE(293) in .\source\classes\DIALOG.PRG
Called from SAMPLERS(76) in Luis.prg
Called from TWINDOW:ACTIVATE(1006) in .\source\classes\WINDOW.PRG
Called from MAIN(33) in Luis.prg
------------------------------------------------------------------------

Saludos..
Last edited by cuatecatl82 on Sat Nov 21, 2015 5:56 pm, edited 1 time in total.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3

Postby Antonio Linares » Sat Nov 21, 2015 10:38 am

Victor,

Prueba a no llamar a SysRefresh() desde BTNPLAYSND(449) en Luis.prg
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41324
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Duracion de un mp3

Postby cuatecatl82 » Sat Nov 21, 2015 11:57 am

Gracias Maestro buenos días:

He revisado el codigo y se lo he quitado, el error que generaba es porque tenía instalado los codecs de sonido y video de K-lite Codepc al parecer no le gusta que sea llamado varias veces por Fw, una vez desinstaladas se corrigió el fallo, pero aún me falta saber la duración de un archivo, se que con MCI se puedenpero no logró comunicarme no se si desde alguna función en lenguaje C se pueda lograr..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3

Postby Antonio Linares » Sat Nov 21, 2015 12:53 pm

Victor,

Este código puede servir:
Code: Select all  Expand view
Private Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" (ByVal lpstrCommand As String, _
                                                                           ByVal lpstrReturnString As String, _
                                                                           ByVal uReturnLength As Long, _
                                                                           ByVal hwndCallback As Long) As Long
Dim FileName As String

Private Sub Form_Load()
Dim RetString As String * 256

    FileName = "c:\my music\whatever.mp3"
   
    mciSendString "Open " & FileName & " alias SoundFile", vbNullString, 0, 0&
    mciSendString "Set SoundFile time format milliseconds", vbNullString, 0, 0&
    mciSendString "Status SoundFile length", RetString, Len(RetString), 0&
    MsgBox CLng(RetString) & " milliseconds"
    mciSendString "Close SoundFile", vbNullString, 0, 0&

End Sub


http://www.vbforums.com/showthread.php?395665-help-with-mciSendString-song-duration-resolved

En FWH tenemos la función MciSendStr()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41324
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Duracion de un mp3

Postby acuellar » Sat Nov 21, 2015 2:35 pm

Con TActiveX

Se obtiene así
Code: Select all  Expand view


 oActiveX = TActiveX():New( oDlg, "WMPlayer.OCX" )
oActiveX:url ="Music.MP3"
oActiveX : currentmedia:durationString
     
 


Saludos,

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1593
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Duracion de un mp3

Postby cuatecatl82 » Sat Nov 21, 2015 4:07 pm

Gracias Adhemar por tu idea, pero necesito trabajar solo con MCISendStr()

Por ahora he traducido lo siguiente:

Code: Select all  Expand view

Local cFile:= "C:\Pruebas\Luis\demo_prueba_de_sonido_Explosion_de_Misil.mp3"
Local nSec:= 0

mciSendStr("OPEN " + LFN2SFN(cFile) + " TYPE MPEGVIDEO ALIAS SuenaMP3",, oWnd:hWnd )
mciSendStr("SET SuenaMP3 TIME FORMAT MILLSECONDS",, oWnd:hWnd )
mciSendStr("STATUS SuenaMP3  LENGTH",@nSec,, oWnd:hWnd )
           
MSGInfo(nSec,VALTYPE(nSec))
 


En un mp3 que dura 00:08 Segundos me indica 14856 en tipo de valor Caracter.
en otro que dura 00:10 Segundos indica 10031 tambien en caracter, éste es el más proximo al valor en milisegundos al tiempo que dura el archivo, no se si lo estoy aplicando de forma correcta, en todos los archivos me indica diferentes valores, per que convertidos a segundos no cuadra..

Saludos.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3

Postby cuatecatl82 » Sat Nov 21, 2015 5:24 pm

Buscando Información en Google encontre este sitio http://wap.clipper.borda.ru/?1-4-240-00000833-000-0-0 en ruso, donde hay una clase para reproducri mp3, la dejo tal cual, ojala se pueda traducir a Fivewin, pues creo que es para MiniGui, pero la clase es entendible..

Code: Select all  Expand view
/******************************************************************************
Programa: TMp3 class Version: 1.0 (c) Cristobal Molla [cemese@terra.es] Revised by Grigory Filatov <gfilatov@inbox.ru>
******************************************************************************/


#include "hbclass.ch"
#include "directry.ch"

#define BUFFER 200
#define CRLF hb_OsNewLine()
#define TRUE .T.
#define FALSE .F.
#define MCI_MODE_UNKNOW 0
#define MCI_MODE_NOTREADY 1
#define MCI_MODE_PAUSED 2
#define MCI_MODE_PLAYING 3
#define MCI_MODE_STOPPED 4

CLASS TMp3

DATA nId INIT 0
DATA nStatus INIT 0
DATA lOpened INIT FALSE

METHOD ERROR( nError, cMetodo )
METHOD New()
METHOD Open( cFile )
METHOD CLOSE()
METHOD Status()
METHOD Play()
METHOD Pause()
METHOD Stop()

ENDCLASS

METHOD ERROR( nError, cMetodo ) CLASS TMp3

// Declaracion de variables.-------------------------------------------
LOCAL cError AS character LOCAL cTexto AS character
// Inicializacion de variables.----------------------------------------
cError := SPACE( BUFFER )
// Muestra el mensaje de error.----------------------------------------

MCIGetErrorString( nError, @cError )

IF EMPTY( cError )
     cTexto := "Error desconocido al ejecutar el comando "
     cTexto += cMetodo + " del dispositivo MP3 " + CRLF
     cTexto += CRLF cTexto += "C?digo de Error: "
     cTexto += hb_ValtoStr( nError )
ELSE cTexto := "Error al ejecutar el comando "
     cTexto += cMetodo + " del dispositivo MP3 " + CRLF
     cTexto += CRLF cTexto += "C?digo de Error: "
     cTexto += hb_ValtoStr( nError ) + CRLF
     cTexto += "Error: " + cError + " " + CRLF
     cTexto += "Llamado desde: " + PROCNAME( 2 )
ENDIF

MSGInfo( cTexto, "Atenci?n" )

RETURN Nil

METHOD New() CLASS TMp3

::nId := 0
::nStatus := MCI_MODE_UNKNOW
::lOpened := FALSE

RETURN Self

METHOD Open( cFile ) CLASS TMp3
// Declaracion de variables.-------------------------------------------
LOCAL cFileName AS character
LOCAL nError AS numeric
LOCAL cComando AS character
LOCAL cReturn AS character

// Control de parametros.----------------------------------------------
 
  IF !FILE( cFile )
     MSGInfo( "No existe el archivo " + cFile, "TMp3 Class" )
     RETURN ::lOpened
  ENDIF
 
// Inicializacion de variables.----------------------------------------
 
 cFileName := _GetShortPathName( cFile )
 cComando := "OPEN " + cFileName + " TYPE MPEGVIDEO ALIAS MP3"
 cReturn := SPACE( BUFFER )
 
// Abre el fichero especificado.---------------------------------------

nError := MCISendString( cComando, @cReturn, GetActiveWindow() )

IF nError > 0
   ::ERROR( nError, "TMp3:Open()" )
ELSE ::nId := MCIGetDeviceId( "MP3" )
     ::nStatus := ::Status()
     ::lOpened := TRUE
ENDIF

RETURN ::lOpened

METHOD CLOSE() CLASS TMp3
// Declaracion de variables.-------------------------------------------
LOCAL nError AS numeric
LOCAL cComando AS character
LOCAL cReturn AS character
// Inicializacion de variables.----------------------------------------
cComando := "CLOSE MP3"
cReturn := SPACE( BUFFER )
// Obtiene el modo.----------------------------------------------------
nError := MCISendString( cComando, @cReturn, GetActiveWindow() )

 IF nError > 0
    ::ERROR( nError, "TMp3:Close()" )
 ELSE
    ::lOpened := FALSE
 ENDIF
 
 RETURN ::lOpened
 
METHOD Status() CLASS TMp3
// Declaracion de variables.-------------------------------------------
LOCAL nError AS NUMERIC
LOCAL cComando AS CHARACTER
LOCAL cReturn AS CHARACTER
// Inicializacion de variables.----------------------------------------
cComando := "STATUS MP3 MODE "
cReturn := SPACE( BUFFER )
// Obtiene el modo.----------------------------------------------------
nError := MCISendString( cComando, @cReturn, GetActiveWindow() )

IF nError > 0
::ERROR( nError, "TMp3:Status()" )
ELSE
   DO CASE
     CASE cReturn == "not ready"
          ::nStatus := MCI_MODE_NOTREADY
     CASE cReturn == "paused"
          ::nStatus := MCI_MODE_PAUSED
     CASE cReturn == "playing"
          ::nStatus := MCI_MODE_PLAYING
     CASE cReturn == "stopped"
          ::nStatus := MCI_MODE_STOPPED
    OTHERWISE ::nStatus := MCI_MODE_UNKNOW
  ENDCASE
ENDIF

RETURN cReturn


METHOD Play() CLASS TMp3
// Declaracion de variables.-------------------------------------------
LOCAL nError
LOCAL cComando
LOCAL cReturn
// Inicializacion de variables.----------------------------------------

   IF ::Status() == "paused"
      cComando := "RESUME MP3"
 ELSE
      cComando := "PLAY MP3 FROM 0"
ENDIF

cReturn := SPACE( BUFFER )

// Obtiene el modo.----------------------------------------------------
nError := MCISendString( cComando, @cReturn, GetActiveWindow() )

IF nError > 0
::ERROR( nError, "TMp3:Play()" )
ELSE
ENDIF
RETURN Nil


METHOD Pause() CLASS TMp3
// Declaracion de variables.-------------------------------------------
LOCAL nError
LOCAL cComando
LOCAL cReturn
// Inicializacion de variables.----------------------------------------
cComando := "PAUSE MP3"
cReturn := SPACE( BUFFER )
// Obtiene el modo.----------------------------------------------------
nError := MCISendString( cComando, @cReturn, GetActiveWindow() )

IF nError > 0
::ERROR( nError, "TMp3:Pause()" )
ELSE
ENDIF
RETURN Nil

METHOD Stop() CLASS TMp3
// Declaracion de variables.-------------------------------------------
LOCAL nError
LOCAL cComando
LOCAL cReturn
// Inicializacion de variables.----------------------------------------
cComando := "STOP MP3"
cReturn := SPACE( BUFFER )
// Obtiene el modo.----------------------------------------------------
nError := MCISendString( cComando, @cReturn, GetActiveWindow() )

IF nError > 0
::ERROR( nError, "TMp3:Stop()" )
ELSE
ENDIF
RETURN Nil

#pragma BEGINDUMP
// Ficheros de definiciones de C. #include <windows.h> #include <mmsystem.h>
// Ficheros de definiciones de Harbour. #include "hbapi.h"

/******************************************************************************
Procedimiento: MCISendString( cComando, cBuffer )
Parametros: cComando - Caracter. Comando a ejecutar.
             cBuffer - Caracter. Buffer para almacenar la respuesta del comando. Devuelve: Notas:

Prototipo C: MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback );

The mciSendString function sends a command string to an MCI device. The device that the command is sent to is specified in the command string.

Parameters ---------- lpszCommand Address of a null-terminated string that specifies an MCI command string.
For more information about the command strings, see Command Strings. lpszReturnString Address of a buffer that receives return information.
If no return information is needed, this parameter can be NULL. cchReturn Size, in characters, of the return buffer specified by the lpszReturnString parameter.

hwndCallback Handle of a callback window if the “notify” flag was specified in the command string. Return Values -------------
Returns zero if successful or an error otherwise. The low-order word of the returned doubleword value contains the error return value.
If the error is device-specific, the high-order word of the return value is the driver identifier; otherwise, the high-order word is zero.
For a list of possible error values, see Constants: MCIERR Return Values. To retrieve a text description of mciSendString return values, pass the return value to
the mciGetErrorString function.
******************************************************************************/


HB_FUNC ( MCISENDSTRING )
{ // Declaracion de variables.-------------------------------------------
DWORD nError; BYTE bBuffer[ 255 ];
// Envio del comando.--------------------------------------------------
nError = mciSendString( ( LPSTR) hb_parc( 1 ), ( LPTSTR ) bBuffer, 254, ( HWND ) hb_parnl( 3 ) ); hb_storc( bBuffer, 2 );
 // Control de error.---------------------------------------------------
 hb_retnl( nError ); }
 
 
/******************************************************************************
Procedimiento: MCIGetErrorString( nError, @cError )
Parametros: nError - Numerico. Numero del error devuelto por mciSendCommand() o mciSendString().
            cError - Cadena de caracteres con el texto descriptivo del error.
           
            Inicializada. Pasada por referencia. Devuelve: lError - Logico. Verdadero si se encontro la descripcion del error, falso en caso contrario
           
Notas: Devuelve la descripcion de error al enviar un comando MCI.

Prototipo C: BOOL mciGetErrorString( DWORD fdwError, LPTSTR lpszErrorText, UINT cchErrorText );
The mciGetErrorString function retrieves a string that describes the specified MCI error code.
Parameters ---------- fdwError Error code returned by the mciSendCommand or mciSendString function. lpszErrorText
Address of a buffer that receives a null-terminated string describing the specified error. cchErrorText Length of the buffer, in characters,
pointed to by the lpszErrorText parameter. Return Values ------------- Returns TRUE if successful or FALSE if the error code is not known.
******************************************************************************/


HB_FUNC ( MCIGETERRORSTRING ) { BYTE bBuffer[ 255 ];
// Devuelve la descripcion del error.----------------------------------
hb_retl( mciGetErrorString( hb_parnl( 1 ), ( LPTSTR ) bBuffer, 254 ) );
hb_storc( bBuffer, 2 ); }


/******************************************************************************
Procedimiento: MCIGetDeviceID()
Parametros: cDispositivo - Caracter. Nombre del dispositivo o del alias abierto satisfactoriamente.
  Devuelve: El identificador con el nombre del dispositivo o su alias o cero si no esta abierto.
 
Notas: Obtiene el identifiacdor de un dispositivo MCI. Prototipo C: MCIDEVICEID mciGetDeviceID( LPCTSTR lpszDevice );
The mciGetDeviceID function retrieves the device identifier corresponding to the name of an open device.
Parameters ---------- lpszDevice Address of a null-terminated string that specifies the device name or the alias name by which the device is known.
Return Values ------------- Returns the device identifier assigned to the device when it was opened if successful.
The identifier is used in the mciSendCommand function. If the device name is not known, if the device is not open, or if there was not enough memory
to complete the operation, the return value is zero.
******************************************************************************/


HB_FUNC ( MCIGETDEVICEID ) {
// Obtiene el ID del dispositivo o alias MCI.
hb_retni( mciGetDeviceID( hb_parc( 1 ) ) ); }
#pragma ENDDUMP[/pre]

#include "minigui.ch"
SET Proc TO tmp3.prg PROCEDURE Main()
LOCAL oMp3 := TMp3():New() DEFINE WINDOW wndMain ;
TITLE "MP3 Test" ;
main DEFINE main menu DEFINE popup "&Test MP3" menuitem " Open MP3 file and device" ;
ACTION {|| IF( !oMp3:lOpened, ;
                oMp3:Open( getFile( { { "MP3", "*.mp3" } }, "Select File", CurDir(), FALSE, TRUE ) ), ) }
               
                                               menuitem " oMp3:Status()" ;
ACTION {|| IF( oMp3:lOpened, MSGInfo( oMp3:Status() ), ) }
                                              menuitem " oMp3:Play()" ;
ACTION {|| IF( oMp3:lOpened, oMp3:Play(), ) }
                                              menuitem " oMp3:Pause()" ;
ACTION {|| IF( oMp3:lOpened, oMp3:Pause(), ) }
                                              menuitem " oMp3:Stop()" ;
ACTION {|| IF( oMp3:lOpened, oMp3:Stop(), ) }
                                              menuitem " oMp3:Close()" ;
ACTION {|| IF( oMp3:lOpened, oMp3:CLOSE(), ) }
                                              separator
                                              menuitem " Exit" ;
ACTION wndMain.RELEASE() END popup END menu END WINDOW

ACTIVATE WINDOW wndMain

RETURN Nil


No la he probado, pues sigo investigando como obtener la duración del archivo y tambien el evento para determinar si el archivo ha terminado de escucucharse..

Saludos.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3

Postby cuatecatl82 » Sat Nov 21, 2015 5:56 pm

Ok creo que ha quedado resuelto el tiempo de la duración:

Code: Select all  Expand view

Local nTime:= 0

mciSendStr("STATUS SuenaMP3  LENGTH",@nSec,0, oWnd:hWnd )        
nTime:= (((VAL(nSec) / 1000) / 1.7) / 60)

Msginfo(nTime, "Duración")
 


Es la forma más proxima a saber la duración, para poder obtener el evento de si finalizo de reproducirse el mp3 hare un timer en base a la duración, cuando el tiempo se cumpla habra decambiar el bitmap del boton..

El código quedaria Así:

Code: Select all  Expand view
#include "FiveWin.ch"

MEMVAR oApp
STATIC oWnd, oFnt, oCur, oIco, aFile, oPla[60], oRec[60], aAlias, aLSnd[60], aLOpn[60], oTmr[60]


//----------------------------------------------------------------------------//
FUNCTION Main()

   REQUEST HB_LANG_ESWIN
   HB_LANGSELECT( 'ESWIN' )

   SET CENTURY ON
   SET EPOCH TO 2000
   SET DATE FORMAT TO "DD-MM-YYYY"
   SET DECIMALS TO 2
   
   REQUEST DBFCDX
   RDDSETDEFAULT ("DBFCDX")
 
 aFile:= {}
aAlias:= {}
  oApp:= MisDatos()
 
CreaDBF()
FileIni()
 
DEFINE    ICON   oIco RESOURCE "00"
DEFINE    CURSOR oCur RESOURCE "MANO"
DEFINE    FONT   oFnt NAME "Times New Roman" SIZE 0,-14
DEFINE    WINDOW oWnd FROM -10,-10 TO -5, -5 TITLE oApp:MiAppName + " | " + oApp:Describe + "  --  " + oApp:Derechos ICON oIco
oWnd:bInit:= {|| Samplers(), oWnd:END()}
ACTIVATE  WINDOW oWnd

RELEASE All
Hb_GCAll( .T. )
SetProcess( -1, -1, -1 )
CLEAR MEMORY
PostQuitMessage( 0 )
__QUIT()
 
RETURN Nil



//----------------------------------------------------------------------------//
STATIC FUNCTION Samplers()

LOCAL oDlg, oFld

SETKEY( VK_F1, { || MSGInfo("Teclas para Usar:"+CRLF+CRLF+"< F2 >   Abrir Carpeta de Efectos para Agregar más de Sonido."+CRLF+CRLF+;
                                                          "Estas Funciones Requiere Reiniciar el Programa"+CRLF+CRLF+;
                                                          "< F4 >   Ejecutar el Programa en Segundo Plano."+CRLF+;
                                                          "< F5 >   Ejecutar el Programa Siempre Visible.",oApp:MiAppName) } )

SETKEY( VK_F2, { || IF(ISDIR(LEFT(oApp:cDirSound,LEN(oApp:cDirSound) - 1)) == .T., (WinExec("Explorer.exe " + oApp:cDirSound)),(MSGStop("La carpeta  "+ oApp:cDirSound + "  No existe..", oApp:MiAppName))) } )
SETKEY( VK_F4, { || DejaIni(oApp:cDirApp+"SAMPLES.INI","GENERAL","Visible",0), MSGInfo("Para que el Cambio se Efectue Reinicie el Programa",oApp:MiAppName + "  Ventana Normal") } )
SETKEY( VK_F5, { || DejaIni(oApp:cDirApp+"SAMPLES.INI","GENERAL","Visible",1), MSGInfo("Para que el Cambio se Efectue Reinicie el Programa",oApp:MiAppName + "  Siempre Visible") } )


      DEFINE  DIALOG      oDlg    RESOURCE "PAGINA0" TITLE oApp:MiAppName + " | " + oApp:Describe + "  --  " + oApp:Derechos  ICON oIco TRANSPARENT    
    REDEFINE  FOLDEREX    oFld                       ID 101 OF oDlg PROMPT  "Fiestas 1",   "Fiestas 2",   "Fiestas 3";
                                                                    BITMAPS "FIESTA1",     "FIESTA2",     "FIESTA3";
                                                                    DIALOGS "PAGINA1",     "PAGINA2",     "PAGINA3" ROUND 5                          
   
   oFld:lTransparent := .T.
   oFld:nFolderHeight := 28
   oFld:nSeparator := 80
   oFld:bClrText := {|| GetSysColor(2) }
   oFld:bAction := {|| oFld:aDialogs[1]:Refresh(), oFld:aDialogs[2]:Refresh(), oFld:aDialogs[3]:Refresh() }
   oFld:lStretch:= .F.
   oFld:oFont := oFnt
   oDlg:lHelpIcon:= .F.
     
   Pagina1(oFld)
   Pagina2(oFld)
   Pagina3(oFld)
   
   
   oDlg:bInit:= {|| oDlg:Move(oApp:nTop,oApp:nRight), IF(oApp:lOnTop == .T.,(SetWindowPos(oDlg:hWnd,-1,0,0,0,0,3)),(SysRefresh())), CargaSnds()}
   oDlg:bMoved:= {|| oDlg:CoorsUpdate(), DejaIni(oApp:cDirApp+"SAMPLES.INI","GENERAL","Arriba",(oDlg:nTop - 130)), DejaIni(oApp:cDirApp+"SAMPLES.INI","GENERAL","Derecha",(oDlg:nLeft - 75))}
   
    ACTIVATE DIALOG      oDlg VALID (Self, MsgYesNo("¿ Deseas Salir ?",oApp:MiAppName))
   
    WHILE oFnt:nCount > 0
      oFnt:END()
    ENDDO
 

    MCISendStr("STOP ALL",0, oWnd:hWnd)
    MCISendStr("CLOSE ALL",0, oWnd:hWnd)
     
 
RETURN Nil



//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION Pagina1(oFld)

LOCAL N,oBrush

       DEFINE BRUSH       oBrush    RESOURCE "BMP1"
     REDEFINE BUTTONBMP   oPla[1]                     ID 201  OF oFld:aDialogs[1] ACTION BtnPlaySnd(1,.F.)
     REDEFINE BUTTONBMP   oPla[2]                     ID 202  OF oFld:aDialogs[1] ACTION BtnPlaySnd(2,.F.)
     REDEFINE BUTTONBMP   oPla[3]                     ID 203  OF oFld:aDialogs[1] ACTION BtnPlaySnd(3,.F.)
     REDEFINE BUTTONBMP   oPla[4]                     ID 204  OF oFld:aDialogs[1] ACTION BtnPlaySnd(4,.F.)
     REDEFINE BUTTONBMP   oPla[5]                     ID 205  OF oFld:aDialogs[1] ACTION BtnPlaySnd(5,.F.)
     REDEFINE BUTTONBMP   oPla[6]                     ID 206  OF oFld:aDialogs[1] ACTION BtnPlaySnd(6,.F.)
     REDEFINE BUTTONBMP   oPla[7]                     ID 207  OF oFld:aDialogs[1] ACTION BtnPlaySnd(7,.F.)
     REDEFINE BUTTONBMP   oPla[8]                     ID 208  OF oFld:aDialogs[1] ACTION BtnPlaySnd(8,.F.)
     REDEFINE BUTTONBMP   oPla[9]                     ID 209  OF oFld:aDialogs[1] ACTION BtnPlaySnd(9,.F.)
     REDEFINE BUTTONBMP   oPla[10]                    ID 210  OF oFld:aDialogs[1] ACTION BtnPlaySnd(10,.F.)
     REDEFINE BUTTONBMP   oPla[11]                    ID 211  OF oFld:aDialogs[1] ACTION BtnPlaySnd(11,.F.)
     REDEFINE BUTTONBMP   oPla[12]                    ID 212  OF oFld:aDialogs[1] ACTION BtnPlaySnd(12,.F.)
     REDEFINE BUTTONBMP   oPla[13]                    ID 213  OF oFld:aDialogs[1] ACTION BtnPlaySnd(13,.F.)
     REDEFINE BUTTONBMP   oPla[14]                    ID 214  OF oFld:aDialogs[1] ACTION BtnPlaySnd(14,.F.)
     REDEFINE BUTTONBMP   oPla[15]                    ID 215  OF oFld:aDialogs[1] ACTION BtnPlaySnd(15,.F.)
     REDEFINE BUTTONBMP   oPla[16]                    ID 216  OF oFld:aDialogs[1] ACTION BtnPlaySnd(16,.F.)
     REDEFINE BUTTONBMP   oPla[17]                    ID 217  OF oFld:aDialogs[1] ACTION BtnPlaySnd(17,.F.)
     REDEFINE BUTTONBMP   oPla[18]                    ID 218  OF oFld:aDialogs[1] ACTION BtnPlaySnd(18,.F.)
     REDEFINE BUTTONBMP   oPla[19]                    ID 219  OF oFld:aDialogs[1] ACTION BtnPlaySnd(19,.F.)
     REDEFINE BUTTONBMP   oPla[20]                    ID 220  OF oFld:aDialogs[1] ACTION BtnPlaySnd(20,.F.)
     
     REDEFINE BUTTONBMP   oRec[1]  RESOURCE "RECORD"  ID 301  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(1)
     REDEFINE BUTTONBMP   oRec[2]  RESOURCE "RECORD"  ID 302  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(2)
     REDEFINE BUTTONBMP   oRec[3]  RESOURCE "RECORD"  ID 303  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(3)
     REDEFINE BUTTONBMP   oRec[4]  RESOURCE "RECORD"  ID 304  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(4)
     REDEFINE BUTTONBMP   oRec[5]  RESOURCE "RECORD"  ID 305  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(5)
     REDEFINE BUTTONBMP   oRec[6]  RESOURCE "RECORD"  ID 306  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(6)
     REDEFINE BUTTONBMP   oRec[7]  RESOURCE "RECORD"  ID 307  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(7)
     REDEFINE BUTTONBMP   oRec[8]  RESOURCE "RECORD"  ID 308  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(8)
     REDEFINE BUTTONBMP   oRec[9]  RESOURCE "RECORD"  ID 309  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(9)
     REDEFINE BUTTONBMP   oRec[10] RESOURCE "RECORD"  ID 310  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(10)
     REDEFINE BUTTONBMP   oRec[11] RESOURCE "RECORD"  ID 311  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(11)
     REDEFINE BUTTONBMP   oRec[12] RESOURCE "RECORD"  ID 312  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(12)
     REDEFINE BUTTONBMP   oRec[13] RESOURCE "RECORD"  ID 313  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(13)
     REDEFINE BUTTONBMP   oRec[14] RESOURCE "RECORD"  ID 314  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(14)
     REDEFINE BUTTONBMP   oRec[15] RESOURCE "RECORD"  ID 315  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(15)
     REDEFINE BUTTONBMP   oRec[16] RESOURCE "RECORD"  ID 316  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(16)
     REDEFINE BUTTONBMP   oRec[17] RESOURCE "RECORD"  ID 317  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(17)
     REDEFINE BUTTONBMP   oRec[18] RESOURCE "RECORD"  ID 318  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(18)
     REDEFINE BUTTONBMP   oRec[19] RESOURCE "RECORD"  ID 319  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(19)
     REDEFINE BUTTONBMP   oRec[20] RESOURCE "RECORD"  ID 320  OF oFld:aDialogs[1] ACTION BtnGuardaSnd(20)
     
     FOR N:= 1 TO 20
       oPla[N]:SetFont(oFnt)
       oPla[N]:oCursor:= oCur
       oPla[N]:cTooltip:= "Reproducir Efecto Grabado en " + ALLTRIM(STR(N))
    NEXT
   
    FOR N:= 1 TO 20
       oRec[N]:oCursor:= oCur
       oRec[N]:cTooltip:= "Grabar Efecto en el Boton " + ALLTRIM(STR(N))
    NEXT
   
    oFld:aDialogs[1]:SetBrush( oBrush )

  RELEASE BRUSH oBrush
           
RETURN Nil



//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION Pagina2(oFld)

LOCAL N,oBrush

       DEFINE BRUSH       oBrush    RESOURCE "BMP2"
     REDEFINE BUTTONBMP   oPla[21]                    TEXTRIGHT  ID 201  OF oFld:aDialogs[2] ACTION BtnPlaySnd(21,.F.)
     REDEFINE BUTTONBMP   oPla[22]                    TEXTRIGHT  ID 202  OF oFld:aDialogs[2] ACTION BtnPlaySnd(22,.F.)
     REDEFINE BUTTONBMP   oPla[23]                    TEXTRIGHT  ID 203  OF oFld:aDialogs[2] ACTION BtnPlaySnd(23,.F.)
     REDEFINE BUTTONBMP   oPla[24]                    TEXTRIGHT  ID 204  OF oFld:aDialogs[2] ACTION BtnPlaySnd(24,.F.)
     REDEFINE BUTTONBMP   oPla[25]                    TEXTRIGHT  ID 205  OF oFld:aDialogs[2] ACTION BtnPlaySnd(25,.F.)
     REDEFINE BUTTONBMP   oPla[26]                    TEXTRIGHT  ID 206  OF oFld:aDialogs[2] ACTION BtnPlaySnd(26,.F.)
     REDEFINE BUTTONBMP   oPla[27]                    TEXTRIGHT  ID 207  OF oFld:aDialogs[2] ACTION BtnPlaySnd(27,.F.)
     REDEFINE BUTTONBMP   oPla[28]                    TEXTRIGHT  ID 208  OF oFld:aDialogs[2] ACTION BtnPlaySnd(28,.F.)
     REDEFINE BUTTONBMP   oPla[29]                    TEXTRIGHT  ID 209  OF oFld:aDialogs[2] ACTION BtnPlaySnd(29,.F.)
     REDEFINE BUTTONBMP   oPla[30]                    TEXTRIGHT  ID 210  OF oFld:aDialogs[2] ACTION BtnPlaySnd(30,.F.)
     REDEFINE BUTTONBMP   oPla[31]                    TEXTRIGHT  ID 211  OF oFld:aDialogs[2] ACTION BtnPlaySnd(31,.F.)
     REDEFINE BUTTONBMP   oPla[32]                    TEXTRIGHT  ID 212  OF oFld:aDialogs[2] ACTION BtnPlaySnd(32,.F.)
     REDEFINE BUTTONBMP   oPla[33]                    TEXTRIGHT  ID 213  OF oFld:aDialogs[2] ACTION BtnPlaySnd(33,.F.)
     REDEFINE BUTTONBMP   oPla[34]                    TEXTRIGHT  ID 214  OF oFld:aDialogs[2] ACTION BtnPlaySnd(34,.F.)
     REDEFINE BUTTONBMP   oPla[35]                    TEXTRIGHT  ID 215  OF oFld:aDialogs[2] ACTION BtnPlaySnd(35,.F.)
     REDEFINE BUTTONBMP   oPla[36]                    TEXTRIGHT  ID 216  OF oFld:aDialogs[2] ACTION BtnPlaySnd(36,.F.)
     REDEFINE BUTTONBMP   oPla[37]                    TEXTRIGHT  ID 217  OF oFld:aDialogs[2] ACTION BtnPlaySnd(37,.F.)
     REDEFINE BUTTONBMP   oPla[38]                    TEXTRIGHT  ID 218  OF oFld:aDialogs[2] ACTION BtnPlaySnd(38,.F.)
     REDEFINE BUTTONBMP   oPla[39]                    TEXTRIGHT  ID 219  OF oFld:aDialogs[2] ACTION BtnPlaySnd(39,.F.)
     REDEFINE BUTTONBMP   oPla[40]                    TEXTRIGHT  ID 220  OF oFld:aDialogs[2] ACTION BtnPlaySnd(40,.F.)
     
     REDEFINE BUTTONBMP   oRec[21]  RESOURCE "RECORD"            ID 301  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(21)
     REDEFINE BUTTONBMP   oRec[22]  RESOURCE "RECORD"            ID 302  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(22)
     REDEFINE BUTTONBMP   oRec[23]  RESOURCE "RECORD"            ID 303  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(23)
     REDEFINE BUTTONBMP   oRec[24]  RESOURCE "RECORD"            ID 304  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(24)
     REDEFINE BUTTONBMP   oRec[25]  RESOURCE "RECORD"            ID 305  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(25)
     REDEFINE BUTTONBMP   oRec[26]  RESOURCE "RECORD"            ID 306  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(26)
     REDEFINE BUTTONBMP   oRec[27]  RESOURCE "RECORD"            ID 307  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(27)
     REDEFINE BUTTONBMP   oRec[28]  RESOURCE "RECORD"            ID 308  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(28)
     REDEFINE BUTTONBMP   oRec[29]  RESOURCE "RECORD"            ID 309  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(29)
     REDEFINE BUTTONBMP   oRec[30]  RESOURCE "RECORD"            ID 310  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(30)
     REDEFINE BUTTONBMP   oRec[31]  RESOURCE "RECORD"            ID 311  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(31)
     REDEFINE BUTTONBMP   oRec[32]  RESOURCE "RECORD"            ID 312  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(32)
     REDEFINE BUTTONBMP   oRec[33]  RESOURCE "RECORD"            ID 313  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(33)
     REDEFINE BUTTONBMP   oRec[34]  RESOURCE "RECORD"            ID 314  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(34)
     REDEFINE BUTTONBMP   oRec[35]  RESOURCE "RECORD"            ID 315  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(35)
     REDEFINE BUTTONBMP   oRec[36]  RESOURCE "RECORD"            ID 316  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(36)
     REDEFINE BUTTONBMP   oRec[37]  RESOURCE "RECORD"            ID 317  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(37)
     REDEFINE BUTTONBMP   oRec[38]  RESOURCE "RECORD"            ID 318  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(38)
     REDEFINE BUTTONBMP   oRec[39]  RESOURCE "RECORD"            ID 319  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(39)
     REDEFINE BUTTONBMP   oRec[40]  RESOURCE "RECORD"            ID 320  OF oFld:aDialogs[2] ACTION BtnGuardaSnd(40)
     
     FOR N:= 21 TO 40
       oPla[N]:SetFont(oFnt)
       oPla[N]:oCursor:= oCur
       oPla[N]:cTooltip:= "Reproducir Efecto Grabado en " + ALLTRIM(STR(N))
    NEXT
   
    FOR N:= 21 TO 40
       oRec[N]:oCursor:= oCur
       oRec[N]:cTooltip:= "Grabar Efecto en el Boton " + ALLTRIM(STR(N))
    NEXT
   
    oFld:aDialogs[2]:SetBrush( oBrush )

  RELEASE BRUSH oBrush
   
RETURN Nil



//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION Pagina3(oFld)

LOCAL N,oBrush

       DEFINE BRUSH       oBrush   RESOURCE "BMP3"
     REDEFINE BUTTONBMP   oPla[41]                    TEXTRIGHT  ID 201  OF oFld:aDialogs[3] ACTION BtnPlaySnd(41,.F.)
     REDEFINE BUTTONBMP   oPla[42]                    TEXTRIGHT  ID 202  OF oFld:aDialogs[3] ACTION BtnPlaySnd(42,.F.)
     REDEFINE BUTTONBMP   oPla[43]                    TEXTRIGHT  ID 203  OF oFld:aDialogs[3] ACTION BtnPlaySnd(43,.F.)
     REDEFINE BUTTONBMP   oPla[44]                    TEXTRIGHT  ID 204  OF oFld:aDialogs[3] ACTION BtnPlaySnd(44,.F.)
     REDEFINE BUTTONBMP   oPla[45]                    TEXTRIGHT  ID 205  OF oFld:aDialogs[3] ACTION BtnPlaySnd(45,.F.)
     REDEFINE BUTTONBMP   oPla[46]                    TEXTRIGHT  ID 206  OF oFld:aDialogs[3] ACTION BtnPlaySnd(46,.F.)
     REDEFINE BUTTONBMP   oPla[47]                    TEXTRIGHT  ID 207  OF oFld:aDialogs[3] ACTION BtnPlaySnd(47,.F.)
     REDEFINE BUTTONBMP   oPla[48]                    TEXTRIGHT  ID 208  OF oFld:aDialogs[3] ACTION BtnPlaySnd(48,.F.)
     REDEFINE BUTTONBMP   oPla[49]                    TEXTRIGHT  ID 209  OF oFld:aDialogs[3] ACTION BtnPlaySnd(49,.F.)
     REDEFINE BUTTONBMP   oPla[50]                    TEXTRIGHT  ID 210  OF oFld:aDialogs[3] ACTION BtnPlaySnd(50,.F.)
     REDEFINE BUTTONBMP   oPla[51]                    TEXTRIGHT  ID 211  OF oFld:aDialogs[3] ACTION BtnPlaySnd(51,.F.)
     REDEFINE BUTTONBMP   oPla[52]                    TEXTRIGHT  ID 212  OF oFld:aDialogs[3] ACTION BtnPlaySnd(52,.F.)
     REDEFINE BUTTONBMP   oPla[53]                    TEXTRIGHT  ID 213  OF oFld:aDialogs[3] ACTION BtnPlaySnd(53,.F.)
     REDEFINE BUTTONBMP   oPla[54]                    TEXTRIGHT  ID 214  OF oFld:aDialogs[3] ACTION BtnPlaySnd(54,.F.)
     REDEFINE BUTTONBMP   oPla[55]                    TEXTRIGHT  ID 215  OF oFld:aDialogs[3] ACTION BtnPlaySnd(55,.F.)
     REDEFINE BUTTONBMP   oPla[56]                    TEXTRIGHT  ID 216  OF oFld:aDialogs[3] ACTION BtnPlaySnd(56,.F.)
     REDEFINE BUTTONBMP   oPla[57]                    TEXTRIGHT  ID 217  OF oFld:aDialogs[3] ACTION BtnPlaySnd(57,.F.)
     REDEFINE BUTTONBMP   oPla[58]                    TEXTRIGHT  ID 218  OF oFld:aDialogs[3] ACTION BtnPlaySnd(58,.F.)
     REDEFINE BUTTONBMP   oPla[59]                    TEXTRIGHT  ID 219  OF oFld:aDialogs[3] ACTION BtnPlaySnd(59,.F.)
     REDEFINE BUTTONBMP   oPla[60]                    TEXTRIGHT  ID 220  OF oFld:aDialogs[3] ACTION BtnPlaySnd(60,.F.)
     
     REDEFINE BUTTONBMP   oRec[41]  RESOURCE "RECORD"            ID 301  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(41)
     REDEFINE BUTTONBMP   oRec[42]  RESOURCE "RECORD"            ID 302  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(42)
     REDEFINE BUTTONBMP   oRec[43]  RESOURCE "RECORD"            ID 303  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(43)
     REDEFINE BUTTONBMP   oRec[44]  RESOURCE "RECORD"            ID 304  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(44)
     REDEFINE BUTTONBMP   oRec[45]  RESOURCE "RECORD"            ID 305  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(45)
     REDEFINE BUTTONBMP   oRec[46]  RESOURCE "RECORD"            ID 306  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(46)
     REDEFINE BUTTONBMP   oRec[47]  RESOURCE "RECORD"            ID 307  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(47)
     REDEFINE BUTTONBMP   oRec[48]  RESOURCE "RECORD"            ID 308  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(48)
     REDEFINE BUTTONBMP   oRec[49]  RESOURCE "RECORD"            ID 309  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(49)
     REDEFINE BUTTONBMP   oRec[50]  RESOURCE "RECORD"            ID 310  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(50)
     REDEFINE BUTTONBMP   oRec[51]  RESOURCE "RECORD"            ID 311  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(51)
     REDEFINE BUTTONBMP   oRec[52]  RESOURCE "RECORD"            ID 312  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(52)
     REDEFINE BUTTONBMP   oRec[53]  RESOURCE "RECORD"            ID 313  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(53)
     REDEFINE BUTTONBMP   oRec[54]  RESOURCE "RECORD"            ID 314  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(54)
     REDEFINE BUTTONBMP   oRec[55]  RESOURCE "RECORD"            ID 315  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(55)
     REDEFINE BUTTONBMP   oRec[56]  RESOURCE "RECORD"            ID 316  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(56)
     REDEFINE BUTTONBMP   oRec[57]  RESOURCE "RECORD"            ID 317  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(57)
     REDEFINE BUTTONBMP   oRec[58]  RESOURCE "RECORD"            ID 318  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(58)
     REDEFINE BUTTONBMP   oRec[59]  RESOURCE "RECORD"            ID 319  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(59)
     REDEFINE BUTTONBMP   oRec[60]  RESOURCE "RECORD"            ID 320  OF oFld:aDialogs[3] ACTION BtnGuardaSnd(60)
     
     FOR N:= 41 TO 60
       oPla[N]:SetFont(oFnt)
       oPla[N]:oCursor:= oCur
       oPla[N]:cTooltip:= "Reproducir Efecto Grabado en " + ALLTRIM(STR(N))
    NEXT
   
    FOR N:= 41 TO 60
       oRec[N]:oCursor:= oCur
       oRec[N]:cTooltip:= "Grabar Efecto en el Boton " + ALLTRIM(STR(N))
    NEXT
   
    oFld:aDialogs[3]:SetBrush( oBrush )

  RELEASE BRUSH oBrush

     
RETURN Nil



//----------------------------------------------------------------------------//
STATIC FUNCTION CreaDBF()

LOCAL N

IF     !FILE(oApp:cDirApp+"SAMPLES.DBF")
    DBCREATE(oApp:cDirApp+"SAMPLES.DBF",   { { "BOTON",    "N", 02, 00},;
                                             { "ETIQUETA", "C", 15, 00},;
                                             { "ARCHIVO" , "C", 50, 00} })

DBUSEAREA(.T.,,oApp:cDirApp+"SAMPLES.DBF","CARGAR")



FOR N:= 1 TO 60
(CARGAR->(DBGOBOTTOM()))
(CARGAR->(DBAPPEND()))
 CARGAR->BOTON:= N
(CARGAR->(DBCOMMIT()))
NEXT


DBCLOSEALL()


                                             
ENDIF

IF !ISDIR(oApp:cDirSound)
   lMKDIR(oApp:cDirSound)
ENDIF

RETURN Nil



//----------------------------------------------------------------------------//
STATIC FUNCTION FileIni()

LOCAL  nHandle
LOCAL cCFGFile:= oApp:cDirApp+"SAMPLES.INI"
LOCAL   cScrip:= "[GENERAL]"+CRLF+;
                 "Visible=1"+CRLF+;
                 "Arriba=0"+CRLF+;
                 "Derecha=0"
                 
                 
                 
IF     !FILE(cCFGFile)
    nHandle:= FCREATE(cCFGFile)
              SysRefresh()
              SysWait(0.1)
    FWRITE(nHandle, cScrip)
              SysRefresh()
              SysWait(0.1)
    FCLOSE(nHandle)
              SysRefresh()
              SysWait(0.1)    
             
ENDIF



IF FILE(cCFGFile)  
    oApp:lOnTop:= IF(VAL(TraeIni(cCFGFile,"GENERAL","Visible")) == 1,(.T.),(.F.))
    oApp:nTop:=  VAL(TraeIni(cCFGFile,"GENERAL","Arriba"))
    oApp:nRight:= VAL(TraeIni(cCFGFile,"GENERAL","Derecha"))
ENDIF


RETURN Nil

//----------------------------------------------------------------------------//
STATIC FUNCTION CargaSnds()

LOCAL N, nRec

IF     FILE(oApp:cDirApp+"SAMPLES.DBF")
DBUSEAREA(.T.,,oApp:cDirApp+"SAMPLES.DBF","SONIDOS")

(SONIDOS->(DBGOTOP()))
nRec:= (SONIDOS->(LASTREC()))

FOR N:= 1 TO nRec
   AADD(aAlias, "SND"+ALLTRIM(STRZERO(N,2)))
   AADD(aFile, ALLTRIM(SONIDOS->ARCHIVO))
   aLSnd[N]:= .F.
   aLOpn[N]:= .F.
   IF FILE(oApp:cDirSound + ALLTRIM(SONIDOS->ARCHIVO))
      oPla[N]:LoadBitmap("PLAY")
      oPla[N]:SetText(SPACE(5)+StrCapFirst(ALLTRIM(SONIDOS->ETIQUETA)))
      oPla[N]:cPosText:= "TEXTRIGHT"
      oPla[N]:Refresh()
   ELSE
      oPla[N]:LoadBitmap("PAUSE")
      oPla[N]:SetText("   Vacio")
      oPla[N]:cPosText:= "TEXTRIGHT"
      oPla[N]:Disable()
      oPla[N]:Refresh()
   ENDIF
   
(SONIDOS->(DBSKIP()))
NEXT

DBCLOSEALL()
ENDIF

RETURN Nil



//----------------------------------------------------------------------------//
STATIC FUNCTION BtnPlaySnd(nBtn)

LOCAL cFile:= oApp:cDirSound+aFile[nBtn]
LOCAL nSec:= 0
LOCAL nMili

IF FILE(cFile)

    IF aLSnd[nBtn] == .F.  
        oPla[nBtn]:LoadBitmap("STOP")
        oPla[nBtn]:Refresh()
       
        IF aLOpn[nBtn] == .F.
           aLOpn[nBtn]:= .T.
           SysRefresh()
           MCISendStr("OPEN " + LFN2SFN(cFile) + " TYPE MPEGVIDEO ALIAS MP3" + aAlias[nBtn],, oWnd:hWnd )
           MCISendStr("SET MP3" + aAlias[nBtn] + " TIME FORMAT MILLSECONDS",, oWnd:hWnd )
           MCISendStr("STATUS MP3" + aAlias[nBtn] + " LENGTH",@nSec,0, oWnd:hWnd )
           nMili:= VAL(nSec)
        ENDIF
         
        SysRefresh()  
        MCISendStr("PLAY MP3" +  aAlias[nBtn] + " FROM 0",, oWnd:hWnd )
        aLSnd[nBtn]:= .T.
        DEFINE TIMER oTmr[nBtn] INTERVAL nMili OF oWnd ACTION (oPla[nBtn]:LoadBitmap("PLAY"),;
                                                               oPla[nBtn]:Refresh(),;
                                                               SysRefresh(),;
                                                               MCISendStr("STOP MP3" + aAlias[nBtn],0, oWnd:hWnd),;
                                                               SysRefresh(),;
                                                               MCISendStr("CLOSE MP3" + aAlias[nBtn],0, oWnd:hWnd),;
                                                               aLSnd[nBtn]:= .F. ,;
                                                               aLOpn[nBtn]:= .F. ,;
                                                               oTmr[nBtn]:DEACTIVATE(),;
                                                               oTmr[nBtn]:END())
                                                               
        oTmr[nBtn]:ACTIVATE()
       
ELSEIF aLSnd[nBtn] == .T.
        oPla[nBtn]:LoadBitmap("PLAY")
        oPla[nBtn]:Refresh()
        SysRefresh()
        MCISendStr("STOP MP3" + aAlias[nBtn],0, oWnd:hWnd)
        SysRefresh()
        MCISendStr("CLOSE MP3" + aAlias[nBtn],0, oWnd:hWnd)
       aLSnd[nBtn]:= .F.
       aLOpn[nBtn]:= .F.
       oTmr[nBtn]:DEACTIVATE()
       oTmr[nBtn]:END()

ENDIF

ELSE
   MSGAlert("El Archivo no existe: "+ cFile, oApp:MiAppName )
ENDIF


RETURN Nil



//----------------------------------------------------------------------------//
STATIC FUNCTION BtnGuardaSnd(nBtn)

LOCAL cLabel
LOCAL cFile:= cGetFile("Archivo de Sonido en MP3     (*.mp3)|*.mp3|", "Agregar Archivo al Sampler", 1, oApp:cDirSound)


IF !EMPTY(cFile) .AND. FILE(cFile) .AND. cFileExt(cFile) == "mp3"

cLabel:= PonLabel()

DBUSEAREA(.T.,,oApp:cDirApp+"SAMPLES.DBF","EDITAR")
(EDITAR->(DBGOTO(nBtn)))
 EDITAR->ARCHIVO:= ALLTRIM(cFileNoPath(cFile))
 EDITAR->ETIQUETA:= cLabel
(EDITAR->(DBCOMMIT()))
DBCLOSEALL()

ADEL(aFile,nBtn)
SysRefresh()
AFILL(aFile,cFileNoPath(cFile),nBtn)
SysRefresh()

oPla[nBtn]:LoadBitmap("PLAY")
oPla[nBtn]:SetText(SPACE(5)+StrCapFirst(ALLTRIM(cLabel)))
oPla[nBtn]:cPosText:= "TEXTRIGHT"  
oPla[nBtn]:Enable()
oPla[nBtn]:Refresh()
     
ENDIF

RETURN Nil



//----------------------------------------------------------------------------//
STATIC FUNCTION PonLabel()

LOCAL oDlg, oGet, oBtn, oCur
LOCAL cNombr:= SPACE(15)
LOCAL lSalir:= .F.

    DEFINE  CURSOR     oCur  RESOURCE "MANO"
    DEFINE  DIALOG     oDlg  RESOURCE "LABEL" TITLE "Etiqueta" ICON oIco
  REDEFINE  GET        oGet  VAR cNombr                  ID 101  OF oDlg PICTURE "@!" VALID(ChaceLbl(cNombr,oGet))
  REDEFINE  BUTTONBMP  oBtn  RESOURCE "OK"    TEXTRIGHT  ID 102  OF oDlg ACTION (lSalir:= .T., oDlg:END())
 
  oDlg:lHelpIcon:= .F.
  oBtn:oCursor:= oCur
  oGet:Refresh()
 
  ACTIVATE  DIALOG     oDlg  CENTERED VALID(Self, lSalir)

RETURN cNombr



//----------------------------------------------------------------------------//
STATIC FUNCTION ChaceLbl(cVar,oGet)

LOCAL lVal

IF EMPTY(ALLTRIM(cVar))
   lVal:= .F.
   MSGStop("La Etiqueta No puede quedar Vacia",oApp:MiAppName)
   oGet:SetFocus()
ELSEIF LEN(ALLTRIM(cVar)) <= 3
   lVal:= .F.
   MSGStop("La Etiqueta es muy Corta",oApp:MiAppName)
   oGet:SetFocus()
ELSEIF LEN(ALLTRIM(cVar)) >= 4
   lVal:= .T.
ENDIF

RETURN lVal



//-----------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION DejaIni(cFile,cSeccion,cEntry,vDato)

LOCAL oIni
 
   INI oIni FILE (cFile)
   SET SECTION cSeccion ENTRY cEntry TO vDato OF oIni
   ENDINI

RETURN Nil



//-----------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION TraeIni(cFile,cSeccion,cEntry)

LOCAL oIni,vGet

   INI oIni FILE (cFile)
   GET vGet SECTION cSeccion ENTRY cEntry OF oIni
   ENDINI

RETURN vGet



//-----------------------------------------------------------------------------------------------------------------//
CLASS MisDatos

DATA Derechos    INIT "SOLDISODFT Software Copyright © 1998-2015"
DATA MiAppName   INIT "MiSamplers"
DATA Describe    INIT "Administrador de Efectos de Sonido"
DATA Propiedad   INIT "Víctor Daniel Cuatecatl León"
DATA cDirApp     INIT cFilePath(GetModuleFileName(GetInstance()))
DATA cDirSound   INIT cFilePath(GetModuleFileName(GetInstance()))+"SAMPLES\"
DATA lOnTop      INIT .F.
DATA nTop        INIT 0
DATA nRight      INIT 0

ENDCLASS

FUNCTION HelpIndex()
//Para Deshabilitar la ayuda del Api de Windows con la tecla F1
RETURN Nil

DLL32 FUNCTION SetProcess( hWnd AS LONG, nMinWorkingSpace AS LONG, nMaxWorkingSpace AS LONG ) AS LONG PASCAL FROM "
SetProcessWorkingSetSize" LIB "Kernel32.dll"


Ojala les sea de utilidad..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3 ( SOLUCIONADO )

Postby Antonio Linares » Sat Nov 21, 2015 11:34 pm

Victor,

muy bueno, gracias! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41324
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Duracion de un mp3 ( SOLUCIONADO )

Postby Armando » Sun Nov 22, 2015 2:26 am

Victor:

Buen trabajo, aunque por el momento no tengo proyecto para usarlo, uno nunca sabe
cuando se necesite.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3066
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Duracion de un mp3 ( SOLUCIONADO )

Postby cuatecatl82 » Sun Nov 22, 2015 4:14 am

Gracias a todos por sus comentarios:

La idea es aportar al foro pero sobre todo que el código fuente no se pierda y pueda ser de apoyo a los compañeros, a veces no tenemos tiempo de investigar y no esta de más dejar un avance, aún faltan más cosas, los comandos MCI son algo engorrosos pero son interesantes..

Saludos.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3 ( SOLUCIONADO )

Postby Jairo Barbosa » Sun Nov 22, 2015 4:14 pm

Victor buen dia

Es un muy buen trabajo
Serias tan amable de facilitarme los recursos? quisiera reproducir tu ejercicio
me parece muy interesante, en años pasados hice una consulta similar a la duracion de cada pista

Gracoas vitor

Jairo
User avatar
Jairo Barbosa
 
Posts: 194
Joined: Fri Jan 23, 2009 2:50 am
Location: Cali Valle Colombia

Re: Duracion de un mp3 ( SOLUCIONADO )

Postby cuatecatl82 » Sun Nov 22, 2015 11:14 pm

Claro:

Les dejo la aplicación creada, los recursos y el archivo fuente..
http://www.mediafire.com/download/hz1w1ld1d9cw359/Payaso.zip


Saludos.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3 ( SOLUCIONADO )

Postby cuatecatl82 » Mon Nov 23, 2015 12:36 am

Pude pasar a Clase de Fivewin la Clase TMp3 original de Minigui de Cristobal Molla:

Incluye un ejemplo el cual estoy probando sin problemas...

http://www.mediafire.com/download/tj9zoly74xaj33f/TMp3.zip

Image
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duracion de un mp3 ( SOLUCIONADO )

Postby karinha » Mon Nov 23, 2015 1:10 pm

Víctor, los archivos están infectados o maliciosos. No és posible bajar. El google chrome no deja. Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7251
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 11 guests