Форум » [x]Harbour » Как проиграть WAV файл ? » Ответить

Как проиграть WAV файл ?

Dima: функции tone уже маловато ;)

Ответов - 25, стр: 1 2 All

gfilatov2002: Если использовать библиотеку CallDLL (есть в поставке минигуи), то можно так: [pre]/* * MiniGUI DLL Demo */ #include "minigui.ch" Procedure Main DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 400 ; TITLE 'Hello World!' ; MAIN ; ON RELEASE UnloadAllDll() DEFINE MAIN MENU DEFINE POPUP 'Test' MENUITEM 'Play Sound' ACTION PlaySound () END POPUP END MENU END WINDOW ACTIVATE WINDOW Win_1 Return Procedure PlaySound // the number of waveform-audio output devices present in the system If CallDll32 ( "waveOutGetNumDevs" , "WINMM.DLL" ) > 0 CallDll32 ( "sndPlaySoundA" , "WINMM.DLL" , "sample.wav" , 0 ) EndIf Return[/pre]

Dima: gfilatov2002 Спасибо , идею понял. Заюзал hbmisc

AlexMyr: в библиотеке hbwin есть ф-я WAPI_PLAYSOUND, может ее попробовать?


Dima: gfilatov2002 За что отвечает последний параметр ?

Dima: AlexMyr пишет: WAPI_PLAYSOUND в с я не силен а посему мне не ясны параметры этой функции

AlexMyr: только что проверил, работает, только подцепить библиотеку hbwin func main WAPI_PLAYSOUND("ALSNDMGR.WAV") return

Dima: AlexMyr Да работает. Спасибо

gfilatov2002: Dima пишет: За что отвечает последний параметр ? BOOL sndPlaySound(LPCSTR lpszSoundFile, UINT wFlags); Через параметр lpszSoundFile этой функции можно передать путь к wav-файлу. Параметр wFlags определяет способ проигрывания звукового фрагмента. Используются следующие значения (некоторые из них можно комбинировать при помощи операции ИЛИ): Значение Описание SND_SYNC Синхронный режим работы. Функция sndPlaySound вернет управление только после завершения проигрывания звукового фрагмента SND_ASYNC Асинхронный режим работы. Функция вернет управление немедленно, проигрывание звукового фрагмента будет выполняться в фоновом режиме параллельно с работой приложения SND_NODEFAULT Если указанный файл не найден, функция "тихо" возвращает управление, не проигрывая никаких звуков. Если же этот флаг не указан, и файл не найден, будет проигран стандартный системный звук, определенный в строке SystemDefault раздела [sound] файла win.ini. А если и это невозможно, функция не будет ничего проигрывать и вернет значение FALSE SND_MEMORY Это значение используется для проигрывания звуковых файлов, загруженных в оперативную память, например, из ресурсов приложения SND_LOOP Если указано значение SND_ASYNC, проигрывание звукового фрагмента будет зациклено. Для того чтобы остановить проигрывание, необходимо вызвать функцию sndPlaySound, указав ей в качестве параметра lpszSoundFile значение NULL SND_NOSTOP При указании этого значения функция проверяет, выполняется ли в настоящий момент проигрывание фрагмента. Если да, функция возвращает значение FALSE

Dima: gfilatov2002 А MP3 файлы как проиграть ?

gfilatov2002: Dima пишет: А MP3 файлы как проиграть ? Посмотри в сторону WinAPI-функции mciSendString: [pre2]HB_FUNC ( MCISENDSTRING ) { DWORD nError; nError = mciSendString( hb_parc( 1 ), hb_parc( 2 ), hb_parcsiz( 2 ), (HWND) hb_parnl( 3 ) ); hb_retni( nError ); } [/pre2]

Dima: gfilatov2002 Спасибо , работает. [pre2] proc main mciSendString("play 14.mp3 wait",,0,) return #pragma BEGINDUMP #include <hbapi.h> #include <windows.h> HB_FUNC ( MCISENDSTRING ) { DWORD nError; nError = mciSendString( hb_parc( 1 ), hb_parc( 2 ), hb_parcsiz( 2 ), (HWND) hb_parnl( 3 ) ); // при сборке ворнинг вот такой Warning W8075 s.prg 21: Suspicious pointer conversion in function HB_FUN_MCISENDSTRING hb_retni( nError ); } #PRAGMA ENDDUMP [/pre2] Нужно покопать еще насчет параметров. Нет ли правильной ссылочки ?

gfilatov2002: Dima пишет: Нужно покопать еще насчет параметров Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long mciSendString посылает строку команды устройству ИНТЕРФЕЙСА УПРАВЛЕНИЯ СРЕДОЙ ПЕРЕДАЧИ ДАННЫХ(MCI). Устройство, которому команда послана, определено в строке команды.Строки команды, используемые с этой функцией могут исполнять почти любую задачу, необходимую для использования устройства мультимедиа, установленного на компьютере. MciSendString обеспечивает относительно простой способ исполнять операции с мультимедиа. Возвращаемое значение В успешном случае функция возвращает 0. В случае ошибки, функция возвращает код ошибки MCI отличный от нуля. Чтобы получить текстовое описание ошибки, используйте функцию mciGetErrorString. lpstrCommand Указатель на строку, которая определяет строку команды MCI. lpstrReturnString Для строк команды,возвращаюх информацию, эта строка получает вывод данных командой. Эта строка должна первоначально быть по крайней мере в длиной 128 символов, долго чтобы получить строку. Любая информация, помещенная в эту строку будет с нулевым символом в конце. Если строка команды не возвращает информацию, этот параметр игнорируется. Если никакой информации возвращения не требуется, этот параметр может быть NULL uReturnLength Размер в символах, буфера возвращений, указанного lpstrReturnString hwndCallback Если "уведомляющийся" флажок строки команды определен, это - дескриптор окна, чтобы получить сообщение MM_MCINOTIFY , когда команда завершается, независимо от того, выполнена ли она или потерпело неудачу.

Dima: gfilatov2002 Спасибо конечно , но чел который в языке С не шарит ни чего не поймет. Как для своих можно проще объяснить ? Какие параметры и тд и тп. Если напряг , буду сам ковырять и убивать кучу времени. PS И да в С я не шарю. Грустно но не шарю.

gfilatov2002: Dima пишет: Как для своих можно проще объяснить ? Выкладываю рабочий класс TMP3 (файл tmp3.prg): [pre]/****************************************************************************** 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] А вот пример его использования в Минигуи: [pre2]#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 [/pre2] Если будут непонятки - спрашивай

Dima: gfilatov2002 Вроде все ясно. Спасибо !

Dima: gfilatov2002 Все таки есть вопрос. Терминал GTWIN Как заставить MP3 играть в фоне ? Короткий пример [pre2] proc main mciSendString("open 14.mp3 type mpegvideo alias MediaFile") mciSendString("play MediaFile wait") // пока полностью не проиграет управление программе не передается //оно и понятно так как параметр WAIT return #pragma BEGINDUMP #include <hbapi.h> #include <windows.h> HB_FUNC ( MCISENDSTRING ) { DWORD nError; nError = mciSendString( hb_parc( 1 ), hb_parc( 2 ), hb_parcsiz( 2 ), (HWND) hb_parnl( 3 ) ); hb_retni( nError ); } #PRAGMA ENDDUMP [/pre2]

gfilatov2002: Dima пишет: Как заставить MP3 играть в фоне ? Попробуй использовать команду play без указания wait: mciSendString("play MediaFile")

Dima: gfilatov2002 пишет: mciSendString("play MediaFile") Да уже понял. Спасибо. Вот так надо. mciSendString("play MediaFile") wait // что то делаем свое ;) или так можно mciSendString("play MediaFile notify" ) wait // что то делаем свое ;)

Sergy: Подскажите плиз начинающему - какими способами затянуть mp3/wav в готовый exe (понимаю, что как-то через ресурс, как наподобие с иконкам). И как его оттуда озвучить ? Спасибо.

Sergy: Sergy пишет: Подскажите плиз начинающему - какими способами затянуть mp3/wav в готовый exe (понимаю, что как-то через ресурс, как наподобие с иконкам). И как его оттуда озвучить ? Очень хочется порадовать юзеров новой программой (внутри есть встроенный обмен сообщениями). Подскажите плиз - как...



полная версия страницы