Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: sebastianarroyo en 15 de Septiembre de 2005, 12:49:47 AM

Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 12:49:47 AM
 Hola, mi nombre es sebastian y tengo la siguiente inquietud.
Nesecito reproducir archivos mp3 y wav con directx.
en estos momentos estoy utilizando directshow, pero la idea es poder seleccionar por cual de las dos placas de auduo que tiene mi Pc quiero que se escuche el audio.
Si alguienm tiene alguna ayuda se lo agradezco.
Un Agrazo, Sebastian !
Título: Seccionar Con Directx
Publicado por: Ray en 15 de Septiembre de 2005, 01:15:29 AM
 No he usado DirectShow pero en DirectX para poder elegir el dispositivo hay que  pasarle el identificador al crear dicho objeto, que previamente hay que obtener con una función de enumeración o con alguna función específica, si ese identificador es NULL toma el dispositivo por defecto, que ahora no estoy seguro pero puede que sea el predeterminado o favorito que tienes en windows.

Un agrazo para ti también.
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 01:22:16 AM
 ´Te agradezco por responder, yo tengo esta rutina para saber los dispositivos de audio instalados.
'Creamos un objeto DirectX7
Dim DirectX As New DirectX7

Dim DDEnum As DirectSoundEnum
Dim nDispositivos As Long, nDispositivo As Long
Dim Cadena As String

' Usamos el método GetDDEnum para iniciar la enumeración
Set DDEnum = DirectX.GetDSEnum
' un bucle para recorrer todos los dispositivos
For nDispositivo = 1 To DDEnum.GetCount
' recuperando la descripción de cada uno de ellos
List1.AddItem DDEnum.GetDescription(nDispositivo)
Next

End Sub
Comentame si sabes hacer lo que me comentaste en tu respuesta anterior.
Nuevamente Gracias.-
Título: Seccionar Con Directx
Publicado por: Ray en 15 de Septiembre de 2005, 01:40:41 AM
 No sabría decirte exactamente lo que tienes que hacer, tendría que mirarlo, supuestamente en la lista que recoges debe incluir los datos que describen el dispositivo, solo te interesan el nombre y el GUID (Identificador único),

lo ideal es mostrar la lista de nombres de dispositivos que has recogido en un ListBox, para poder elegir el dispositivo con el ratón en las opciones.

despues pasar el GUID que corresponda con el nombre de la misma lista.
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 01:49:18 AM
 Todos los nombres los estoy recojiendo en un listbox, el tema es que no se como obtener el GUID y menos poder seleccionarlo antes de la reproduccion.-
Vos tenes alguna idea ?
Sebastian !
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 01:56:41 AM
 El Guid ya lo consegui con esto
List2.AddItem DDEnum.GetGuid(nDispositivo)
Ahora el problema es una ves seleccionado en el list asignar esta guid a la rutina del directshow.-
Título: Seccionar Con Directx
Publicado por: Ray en 15 de Septiembre de 2005, 01:57:36 AM
 Pues de la misma forma que obtienes la descripción (el nombre en cristiano)

DDEnum.GetDescription(nDispositivo)

suponiendo que eliges el segundo de la lista (el número 1)

se debería poder hacer algo así como:

DDEnum.GetGuid(1);
DDEnum.GetDevice(1);
o algo parecido, pero no tengo ni idea, estará en la ayuda.

y pasarlo al crear el DirectSound

Edit: ok, vi tu ultimo mensaje, creo que ahí lo explico, el número debe corresponder
Título: Seccionar Con Directx
Publicado por: Ray en 15 de Septiembre de 2005, 02:05:05 AM
 Creo que ya se lo que dices, tienes que pasarlo como parámetro de la función DirectSoundCreate, seguramente lo tendrás como NULL

Es que yo soy de C++  :lol:

HRESULT WINAPI DirectSoundCreate( LPGUID lpGuid,  LPDIRECTSOUND * ppDS,  
 LPUNKNOWN * pUnkOuter  );
Título: Seccionar Con Directx
Publicado por: AK47 en 15 de Septiembre de 2005, 08:36:20 AM
 Recuerda que por usar mp3 en algo tendrias que pagarles a noseque empresa :P (no se si era solo para cosas comerciales o en todos los casos).
Título: Seccionar Con Directx
Publicado por: Topper en 15 de Septiembre de 2005, 09:24:00 AM
 
CitarRecuerda que por usar mp3 en algo tendrias que pagarles a noseque empresa  (no se si era solo para cosas comerciales o en todos los casos).

Me parece que usando DirectShow no tienes que pagar licencia de uso del formato mp3 (aun siendo para aplicaciones comerciales) debido a que Microsoft ya licenció ese formato de sonido para su utilización en Windows con esa API, y por lo tanto, tú sólo aprovechas el recurso que te ofrece el sistema operativo.

Si estoy equivocado que venga dios y me replique  (twist)  
Título: Seccionar Con Directx
Publicado por: [EX3] en 15 de Septiembre de 2005, 02:32:53 PM
 
Cita de: "Topper"Me parece que usando DirectShow no tienes que pagar licencia de uso del formato mp3 (aun siendo para aplicaciones comerciales) debido a que Microsoft ya licenció ese formato de sonido para su utilización en Windows con esa API, y por lo tanto, tú sólo aprovechas el recurso que te ofrece el sistema operativo.

Si estoy equivocado que venga dios y me replique  (twist)
Arrea! es cierto esto? Con DirectShow no tendrias que pagar royalties por los MP3? Como sea cierto me quito el trabajo de tener que instalar el codec OGG para DirectShow :D

Sobre el tema del post en cuestion, creo, y no me hagais mucho caso, que estais mezclando churras con meninas. DirecShow al contrario que DirectSound no precisa de inicializacion, simplemente se inicializan los objetos que controlan el contenido de audio y video de los archivos multimedia y los objetos para controlar la reproduccion del medio, y no recuerdo ninguna funcion para especificar el dispositivo con el que se quiere reproducir algun medio (ojo, no digo que no exista pero al menos en los ejemplos del SDK para VB6 no he visto nada) lo unico que se que se podria configurar son los codecs (y tampoco lo he mirado mucho... que la documentacion de DirectShow para VB es casi nula...)

Salu2...
Título: Seccionar Con Directx
Publicado por: Topper en 15 de Septiembre de 2005, 02:54:44 PM
 Una url de Microsoft con un documento acerca de Windows Media y el tema de royalties...

Windows Media

Aquí una muestra que habla de los royalties:

CitarHow can I develop Windows Media-based solutions that interoperate through standards or open specifications?
Windows Media Technologies is a platform, and third parties can develop their own plug-in solutions by using standards-based or vendor-based technologies. Windows Media Technologies supports several standards out of the box, including MPEG-4 video and H.263 for video compression and G.726, G.723.1, and MP3 for audio compression. It uses the open Advanced Streaming Format (ASF) for synchronizing and storing the compressed audio and video streams in a file. The specifications for the standard codecs can be obtained from the respective standard organizations, and the specifications for the ASF format are available publicly from the Microsoft Web site (http://www.microsoft.com/windows/windowsmedia/WM7/format/asfspec11300e.asp).
There are royalties associated with some of these technologies, and Microsoft pays the necessary royalties for shipping its implementations of the standard codecs in the Windows operating system.
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 02:59:31 PM
 ok, realmente me meti en un lio, en verdad no se como hacerlo,  pero el resultado tiene que ser poder escuchar un mp3 o un wav en otra placa distinta a la predeterminada-
Si conosen alguna forma con directx o algun OCX, DLL que lo pueda hacer en visual basic se lo agradezco
Saludos !!!
Sebastian.
Título: Seccionar Con Directx
Publicado por: tewe76 en 15 de Septiembre de 2005, 03:33:39 PM
 (OFFTOPIC)¿Significa que se puede usar MP3 en cualquier programa que se ejecute en Windows sin pagar? No creo. Seguramente lo he entendido mal.
Título: Seccionar Con Directx
Publicado por: TheAzazel en 15 de Septiembre de 2005, 03:41:03 PM
 Que alguien lo aclare porque yo pensaba que los MP3 no se podian usar asi como asi....

de todos modos...OGG rulez!
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 04:01:50 PM
 Che , se me desvirtuo la pregunta !!!
No estoy preguntando si se puede utilizar los mp3.
Estoy preguntando si se puede escuchar un archivo mp3 o wav en otra placa que no sea la predeterminada.
Yo estoy haciendo una aplicacion en visual basic.
Nesecitaria algun ejemplo ne directx, DLL o algun OCX.-
Gracias !!
Título: Seccionar Con Directx
Publicado por: AK47 en 15 de Septiembre de 2005, 04:26:51 PM
 Lo que tienes que hacer es enumerar los dispositivos presentes en el equipo sobre el que se ejecuta el programa y dejar al usuario que seleccione el que el desee. Mirate la funcion EnumerateDevices o algo asin ;)
Título: Seccionar Con Directx
Publicado por: Ray en 15 de Septiembre de 2005, 04:42:08 PM
 Recapitulación para iniciar DirectSound en cualquier placa, (en principio solo WAV):

1) Guardamos en una lista los dispositivos y los mostramos en un ListBox

2) Seleccionamos el dispositivo, o lo que es lo mismo... un indice.

3) Creamos DirectSound pasando el Guid del dispositivo que corresponde al indice

Suponiendo que selecciono el 2º dispositivo de la lista, el índice sería el 1 puesto que el primero es 0.

en C++ lo crearía así:


DirectSoundCreate( &Guid[1], &lpDirectSound, NULL);


en VB no tengo ni idea pero debe ser más o menos:


DirectSoundCreate DDEnum.GetGuid(1) , DirectSound, Nothing


si quiero iniciar el septimo dispositivo, le paso DDEnum.GetGuid(6)
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 05:14:15 PM
 te parece que te pase el codigo que tengo para reproducir y asi lo ves. ???

Título: Seccionar Con Directx
Publicado por: Ray en 15 de Septiembre de 2005, 05:29:54 PM
 Como quieras, aunque bastaría con ver solo la parte donde inicias DirectSound.

Si puedes ponlo aquí mismo, no creo que sea muy largo.

usa el botón CODE entre el comienzo y final del código para verlo mejor.
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 15 de Septiembre de 2005, 06:28:24 PM
 
Option Explicit

'//DirectShow Objects
   Private DSAudio  As IBasicAudio         'Basic Audio Objectt
   Private DSEvent As IMediaEvent        'MediaEvent Object
   Private DSControl As IMediaControl    'MediaControl Object
   Private DSPosition As IMediaPosition 'MediaPosition Object
 




Public Function TerminateEngine() As Boolean
On Error GoTo BailOut:

   If ObjPtr(DSControl) > 0 Then
       DSControl.Stop
   End If
               
   If ObjPtr(DSAudio) Then Set DSAudio = Nothing
   If ObjPtr(DSEvent) Then Set DSEvent = Nothing
   If ObjPtr(DSControl) Then Set DSControl = Nothing
   If ObjPtr(DSPosition) Then Set DSPosition = Nothing
               
   TerminateEngine = True
   Exit Function
BailOut:
   TerminateEngine = False
   Debug.Print "ERROR: modDirectShow.TerminateEngine()"
   Debug.Print "     ", Err.Number, Err.Description
End Function


Public Function LoadMP3(FileName As String) As Boolean
On Error GoTo BailOut:

   '//0. Solo Variables
   
   '//1. Destruye Casos Inexistentes
       If Not (TerminateEngine() = True) Then GoTo BailOut:
       
   '//2. Filtro grafico del archivo
       Set DSControl = New FilgraphManager
       Call DSControl.RenderFile(FileName)
   
   '//3. Sistema el objeto básico de audio
       Set DSAudio = DSControl
       DSAudio.Volume = 0
       DSAudio.Balance = 0
   
   '//4. Sistema el acontecimiento de medios de comunicación y objetos de posición
       Set DSEvent = DSControl
       Set DSPosition = DSControl
       If ObjPtr(DSPosition) Then DSPosition.Rate = 1#
       DSPosition.CurrentPosition = 0
       
   
   '//5. Fin

   LoadMP3 = True
   Exit Function
BailOut:
   LoadMP3 = False
   Debug.Print "ERROR: modDirectShow.LoadMP3()"
   Debug.Print "     ", Err.Number, Err.Description
End Function


Esto esta denro del modulo.
el el form tengo las llamadas y solamente esto en el load
[/CODE]
 ScrlBalance_Change
   ScrlSpeed_Change
   ScrlVolume_Change

[CODE]

Título: Seccionar Con Directx
Publicado por: Ray en 15 de Septiembre de 2005, 06:59:49 PM
 En que quedamos, ¿DirectSound o DirectShow?

No se si lo podrás hacer en VB porque creo que tiene limitaciones en DirectX, te digo como creo que es en C++, más no puedo ya decirte porque encima no controlo el VB ni el DirectShow.

La función CreateClassEnumerator que pertenece a dshow sirve para crear un enumerador para las diferentes categorías de dispositivos.

su uso:
Using the System Device Enumerator
Título: Seccionar Con Directx
Publicado por: [EX3] en 15 de Septiembre de 2005, 07:26:57 PM
 
Cita de: "Ray"En que quedamos, ¿DirectSound o DirectShow?
Ya lo comento al principio creo recordar:
Cita de: "sebastianarroyo"Nesecito reproducir archivos mp3 y wav con directx.
en estos momentos estoy utilizando directshow
Cita de: "Ray"No se si lo podrás hacer en VB porque creo que tiene limitaciones en DirectX, te digo como creo que es en C++, más no puedo ya decirte porque encima no controlo el VB ni el DirectShow.
Me temo que asi es. DirectShow esta muy limitado en VB (el unico componente de DirectX capado en VB), no se puede por ejemplo pasar un video a una textura de D3D o superficie de DD, cosa que me interesaba para mi proyecto <_<

Salu2...
Título: Seccionar Con Directx
Publicado por: sebastianarroyo en 16 de Septiembre de 2005, 12:14:56 AM
 ok, gracias por los comentarios.
Ahora mi pregunta es la siguiente, alguien de ustedes que maneje C ++, no me pueden hacer un reproductro para poder reproducir los mp3 y wav.

(ejemplo) Podria ser que la placa la pueda seleccionar desde un INI.
yo luego lo ejecutaria desde afuera.

Elreproductor.exe Misonido.mp3

Gracias !!!
Sebastian.