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 !
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.
´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.-
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.
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 !
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.-
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
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 );
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).
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)
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...
Una url de Microsoft con un documento acerca de Windows Media y el tema de royalties...
Windows MediaAquí 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.
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.
(OFFTOPIC)¿Significa que se puede usar MP3 en cualquier programa que se ejecute en Windows sin pagar? No creo. Seguramente lo he entendido mal.
Que alguien lo aclare porque yo pensaba que los MP3 no se podian usar asi como asi....
de todos modos...OGG rulez!
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 !!
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 ;)
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)
te parece que te pase el codigo que tengo para reproducir y asi lo ves. ???
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.
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]
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
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...
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.