Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Baal_30 en 19 Julio 2014, 12:07 pm



Título: Archivo de audio en C
Publicado por: Baal_30 en 19 Julio 2014, 12:07 pm
Buenas, hace nada hice una "alarma" en C, con temporizador. El post está por aquí ya que necesité ayuda. Ahora, me gustaría que cuando sonara, en vez del pitido ("\a"), sonase una canción o un archivo de audio que yo quiera, supongo que se podrá, y pediría que alguien me guiase un pelín o me de alguna ayuda sobre el tema.

Gracias de antemano.


Título: Re: Archivo de audio en C
Publicado por: leosansan en 19 Julio 2014, 14:39 pm
Buenas, hace nada hice una "alarma" en C, con temporizador. El post está por aquí ya que necesité ayuda. Ahora, me gustaría que cuando sonara, en vez del pitido ("\a"), sonase una canción o un archivo de audio que yo quiera, supongo que se podrá, y pediría que alguien me guiase un pelín o me de alguna ayuda sobre el tema.

Gracias de antemano.

Una forma simple sería:

Código
  1. system("MiCancion.mp3");

si está en la misma carpeta, si no tendrás que especificar la ruta, algo como

Código
  1. system("C:\\carpeta\\OtraCarpeta\\MiCancion.mp3");

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Archivo de audio en C
Publicado por: daryo en 19 Julio 2014, 14:50 pm
que sistema operativo? si es windows te puedo ayudar

Citar
Una forma simple sería:

esa es la mas simple pero no es la mejor xD


Título: Re: Archivo de audio en C
Publicado por: ivancea96 en 19 Julio 2014, 15:34 pm
Tienes la opción de utilizar una librería que simplifique el tema, como por ejemplo SFML.


Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 19 Julio 2014, 16:59 pm
Umm, esa forma simple parece muy simple, como funcione que bien :P

Sí, estoy en windows ¡! ¿Alguna otra forma más correcta? (Por lo que he leído la de system no parece la mejor, pero si sencilla)

Edito: Va genial, pero, ¿no se puede abrir el archivo con C, verdad? O sea, lo que hace system, es abrir el archivo con el reproductor de windows, para que se abriera en mi programa, tendría que crear yo un reproductor de audio, ¿me equivoco?

Gracias


Título: Re: Archivo de audio en C
Publicado por: leosansan en 19 Julio 2014, 17:23 pm
..........................................
Edito: Va genial, pero, ¿no se puede abrir el archivo con C, verdad? O sea, lo que hace system, es abrir el archivo con el reproductor de windows, para que se abriera en mi programa, tendría que crear yo un reproductor de audio, ¿me equivoco?
...................................
.

Antes que nada, me alegro que lo simple te funcione bien.

Conste que yo dije que era  un método sencillo, no el mejor. Pero sin usar las API de Windows ni librerías externas no se puede pedir más. Y si no, aquí estamos todos para aprender cosas nuevas.

Y sí, el archivo se abre con el reproductor que se corresponda con, en este caso, .mp3. Lo otro sería "crear" un reproductor y eso me suena a palabras mayores.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 19 Julio 2014, 17:39 pm
De acuerdo ^^ Y con API de windows o alguna librería externa, como iría el tema¿?



Título: Re: Archivo de audio en C
Publicado por: daryo en 19 Julio 2014, 17:58 pm
Citar
Lo otro sería "crear" un reproductor
en realidad winapi y otras librerias tienen las herramientas para que eso no sea necesario aun asi hacer un reproductor con SFML por ejemplo tampoco seria tan complicado

Citar
con API de windows
ok en eso te puedo ayudar asi se reproduce dentro del mismo ejecutable

 el archivo tiene que ser wav en todo caso hay programas para cambiar el formato con este metodo tienes la ventaja de que no necesitaras archivos externos todo queda dentro del ejecutable.
suponiendo que trabajas en code blocks creas un proyecto:

luego dentro del proyecto en el menu project -> build options -> linker setings -> add

seleccionas el archivo c:\program files\codeblocks\mingw\lib\libwinmm.a la direccion varia dependiendo la carpeta de instalacion de code blocks.

te sale una ventana le das que no y luego ok a todo

en el main pon esto:
para que todo quede en el mismo exe:
Código
  1. #include <windows.h>
  2. #include "res.h"
  3.  
  4.  
  5. int main()
  6. {
  7.    PlaySound(MAKEINTRESOURCE(SONIDO),NULL,SND_RESOURCE);
  8.    return 0;
  9. }

creamos un archivo llamado res.h en code blocks es asi: dentro del proyecto file -> new -> file -> c/c++ header . dentro del archivo pones:

res.h
Código
  1. #define SONIDO 100
  2.  

y por ultimo creamos un tercer archivo file ->new->empty file
el archivo se debe llamar res.rc y dentro del mismo ponemos el nombre y la ubicacion del wav en mi caso "sonido.wav"

 res.rc
Código
  1. #include "res.h"
  2. SONIDO WAVE "sonido.wav"


Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 19 Julio 2014, 18:41 pm
Bien explicado, lo malo es que yo uso Dev++, y estoy mirando en "proyecto" pero no me deja escoger ninguna opción :/


Título: Re: Archivo de audio en C
Publicado por: daryo en 19 Julio 2014, 18:49 pm
en dev creo que era era Tools->project options-> parameters y ahi  pones -lwinmm
en todo caso dev ya esta algo anticuado


Título: Re: Archivo de audio en C
Publicado por: leosansan en 19 Julio 2014, 18:53 pm
Bien explicado, lo malo es que yo uso Dev++, y estoy mirando en "proyecto" pero no me deja escoger ninguna opción :/

"Creo" que en DeV++, una vez que creas un nuevo proyecto, vas a Project y en el mismo a Project Options y en la pestaña Parameters te sitúas en la columna Linker y ahí usas el botón Add Library Object y en la ventanita que se abre seleccionas el libwinmm.a o el que sea.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Archivo de audio en C
Publicado por: ivancea96 en 20 Julio 2014, 00:53 am
Si no te quieres liar, simplemente pon:

Código
  1. #include <windows.h>
  2.  
  3. int main(){
  4.    PlaySound("ruta/archivo.wav",NULL,SND_FILENAME);
  5.    return 0;
  6. }

Así se escuchará el sonido y se detendrá el programa hasta que acabe.


Título: Re: Archivo de audio en C
Publicado por: leosansan en 20 Julio 2014, 12:58 pm

Y otra pequeña variante:

Código
  1. #include <windows.h>
  2.  
  3. int main(void){
  4.  sndPlaySound("C:/WINDOWS/Media/notify.wav",0);
  5.  return 0;
  6. }

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 20 Julio 2014, 13:15 pm
¿Que diferencia hay entre el código de ivancea96 y de leosansan? Ambos son muy parecidos a
Código
  1. system("MiCancion.mp3");
Lo que pasa que con "system" sólo se puede usar con windows. ¿O estoy equivocado?

Y respecto a la otra manera, ya he añadido el libwinmm.a al proyecto, pero no se como crear el res.h y res.rc de la forma que dice daryo, no lo encuentro en Dev ++ :/


Título: Re: Archivo de audio en C
Publicado por: leosansan en 20 Julio 2014, 13:36 pm
¿Que diferencia hay entre el código de ivancea96 y de leosansan? Ambos son muy parecidos a
Código
  1. system("MiCancion.mp3");
Lo que pasa que con "system" sólo se puede usar con windows. ¿O estoy equivocado?

Y respecto a la otra manera, ya he añadido el libwinmm.a al proyecto, pero no se como crear el res.h y res.rc de la forma que dice daryo, no lo encuentro en Dev ++ :/

Creo que todos los que te hemos puesto son para Windows.

Y respecto a lo segundo, una vez que has creado el proyecto y añadido la librería le das a File y en él a New y a su vez a Source File. Te preguntará si añadir al proyecto y le dices que sí y lo guardas como res.rc. Y análogamente con el otro fichero.


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Archivo de audio en C
Publicado por: ivancea96 en 20 Julio 2014, 13:47 pm
System no reproduce el archivo de audio.
system("comando") es como escribir "comando" en la consola.
Al abrirlo con al consola, se abre el archivo con el programa predeterminado para su extensión


Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 20 Julio 2014, 15:59 pm
Genial, ya he probado todas las formas y todas funcionan correctamente, y con la de "PlaySound(MAKEINTRESOURCE(SONIDO),NULL,SND_RESOURCE);" me funciona hasta cambiando el archivo de carpeta, no se si esto es lo normal xD

¿Alguien me puede explicar palabra por palabra la función "PlaySound(MAKEINTRESOURCE(SONIDO),NULL,SND_RESOURCE);"? Se lo agradecería bastante.

También me surje la duda de que, C entonces no puede abrir archivos mp3, pero si .wav, y para todos los códigos que me habéis dicho, el archivo de audio tiene que estar en la misma carpeta del proyecto, o bien añadir su ruta.

En cambio con la función que he usado aquí arriba, el archivo se une directamente al proyecto, por lo que me parece. ¿No?

Gracias a todos :)


Título: Re: Archivo de audio en C
Publicado por: ivancea96 en 20 Julio 2014, 17:13 pm
Compruébalo. Si al peso del ejecutable se le suma el peso del archivo WAV o parecido, sí, se le une.


Título: Re: Archivo de audio en C
Publicado por: daryo en 20 Julio 2014, 17:17 pm
Cita de: Baal_30
me funciona hasta cambiando el archivo de carpeta, no se si esto es lo normal xD
como te decia queda dentro del ejecutable por eso hasta borrando el sonido una vez compilado te funcionaria

Cita de: Baal_30
no puede abrir archivos mp3,
obvio se puede pero no con playsound.

Citar
¿Alguien me puede explicar palabra por palabra la función

Código
  1. PlaySound(MAKEINTRESOURCE(SONIDO),NULL,SND_RESOURCE);
pues a ver el primer parametro

Código
  1. MAKEINTRESOURCE(SONIDO)

aca le digo que seleccione el archivo que se llama SONIDO.el nombre(SONIDO) lo declaramos en resource.rc y resource.h gracias a estos archivos todo queda dentro del mismo ejecutable es lo que se llama resource(recurso) al igual que los iconos que estan en el mismo ejecutable o en algunos casos  las imagenes.
 
Código
  1. NULL
en este caso es un parametro que no nos interesa por eso se le pone NULL , es un handle.

Código
  1. SND_RESOURCE
Le indicamos que el archivo a reproducir es un recurso , si no dara error o no lo reproducira

Código
  1. PlaySound("ruta/archivo.wav",NULL,SND_FILENAME);
mira que cambian los parametros ya no hay recursos:
Código
  1. SND_FILENAME
aca se le dice que no es un recurso si no un archivo asi que lo unico que hace es buscar el archivo y reproducirlo
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743680%28v=vs.85%29.aspx


Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 20 Julio 2014, 17:51 pm
Gracias a todos por responder, y daryo genial explicación, muchas gracias ^^

Así que, al crear el resource.rc y resource.h, el archivo de audio se mete dentro del ejecutable, guardandose en él ¿? Genial.



Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 21 Julio 2014, 15:11 pm
Perdonarme por continuar con el post y por mi ignorancia, pero ahora no consigo que me funciona con una canción que quiero.

El código queda así :
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. #include "res.h"
  6.  
  7. int reloj();
  8. int cuenta();
  9.  
  10. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  11.  
  12. int main(int argc, char *argv[]) {
  13. int op;
  14.  
  15. printf("elige sobre que deseas usar la alarma:\n");
  16. printf("(1) Programar una hora\n");
  17. printf("(2) Cuenta atras\n");
  18. scanf("%d",&op);
  19.  
  20. switch(op){
  21. case 1 : reloj();
  22. break;
  23. case 2 : cuenta();
  24. break;
  25. default : {
  26. system("cls");
  27. printf("Abre de nuevo el programa y elige una opcion correcta.\n\n");
  28. }
  29. }
  30.  
  31. return 0;
  32. }
  33.  
  34. int reloj(){
  35. system("cls");
  36.  
  37. int hh, mm;
  38. struct tm * infoTiempo;
  39. time_t tiempo;
  40.  
  41. printf("Introduce una hora:\n");
  42. scanf("%d",&hh);
  43. printf("Introduce los minutos:\n");
  44. scanf("%d",&mm);
  45.  
  46. printf("La alarma sonara a las %d:%d\n",hh,mm);
  47.  
  48. for(;;){
  49. time(&tiempo);
  50. infoTiempo = localtime(&tiempo);
  51. if((infoTiempo->tm_hour == hh)&&(infoTiempo->tm_min==mm)){
  52. printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a");
  53. break;
  54. }
  55. }
  56.  
  57. return 0;
  58. }
  59.  
  60. int cuenta(){
  61. system("cls");
  62. int hh,mm,ss;
  63. int i,j,ii,ij,ik;
  64. int x = 1000;
  65.  
  66. printf("Introduzca el tiempo para realizar la cuenta atras(HH:MM:SS) :\n");
  67. scanf("%d:%d:%d",&hh,&mm,&ss);
  68.  
  69. for(ii=hh,i=0;ii>=0;ii--,i++){
  70. if(i>0) mm=59,ss=59;
  71. for(ij=mm,j=0;ij>=0;ij--,j++){
  72. if(j>0) ss=59;
  73. for(ik=ss;ik>=0;ik--){
  74. Sleep(x);
  75. printf("La alarma sonara en: %d:%d:%d\r",ii,ij,ik);
  76. if(ii==0&&ij==0&&ik==0){
  77. PlaySound(MAKEINTRESOURCE(SONIDO),NULL,SND_RESOURCE);
  78. }
  79. }
  80. }
  81.  
  82. }
  83.  
  84. return 0;
  85. }

res.h
Código
  1. #define SONIDO 100

res.rc
Código
  1. #include "res.h"
  2. SONIDO WAVE "charlie.wav"

He probado mil cosas, y buscado por google, pero no me funciona con ninguna. La primera vez, cuando me funcionó, en me salió una pestaña en el DEV++ que salían funciones y cosas que no entendía, pero relacionadas con los audios y el sonido. Ahora al crear el proyecto y linkar el libwinmm.a, no me ha salido ¿quizás sea eso? ¿Como me puede salir otra vez encontes? ¿Quizás lo haya borrado yo de la librería o algo de eso?

Y una preguntita que se me olvidó preguntar, el "100" de res.h, ¿que indica? y, "SONIDO WAVE" que significa realmente ¿? Tan sólo marca el archivo de audio que se va a usar, ¿no?

Y ya aprovecho... Donde y cómo se supone que se guarda el archivo de audio en el ejecutable ¿? Una vez compilado y guardado, se puede sacar el archivo de audio de alguna forma ¿?

Gracias y disculpas por las molestias :/

EDITO: Comentar que el archivo de audio lo tengo en la misma carpeta del proyecto, así no hace falta poner la ruta...


Título: Re: Archivo de audio en C
Publicado por: leosansan en 23 Julio 2014, 07:39 am
Perdonarme por continuar con el post y por mi ignorancia, pero ahora no consigo que me funciona con una canción que quiero.
.......................................................
He probado mil cosas, y buscado por google, pero no me funciona con ninguna. La primera vez, cuando me funcionó, en me salió una pestaña en el DEV++ que salían funciones y cosas que no entendía, pero relacionadas con los audios y el sonido. Ahora al crear el proyecto y linkar el libwinmm.a, no me ha salido ¿quizás sea eso? ¿Como me puede salir otra vez encontes? ¿Quizás lo haya borrado yo de la librería o algo de eso?
......................................................

Prueba a añadir nuevamente la librería como ya te indiqué en un mensaje anterior. La prueba que he hecho si me funciona, linkando la librería, claro.

Y aprovecho para indicarte otra manera "simple" de reproducir .mp3:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. int main(){
  6.  mciSendString ("cancion.mp3",NULL,0,0);
  7.  system("pause");
  8.  return 0;
  9. }



¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/simba2.gif)





Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 23 Julio 2014, 13:39 pm
Nada :/, la cargo igual que hice la primeza vez, pero parece que no haga nada, cuando se tendría que escuchar la canción al compilar, me da error :/


Título: Re: Archivo de audio en C
Publicado por: daryo en 23 Julio 2014, 17:17 pm
Nada :/, la cargo igual que hice la primeza vez, pero parece que no haga nada, cuando se tendría que escuchar la canción al compilar, me da error :/

mira si esta linkeada con direccion relativa o absoluta y en caso de que este relativa ponlo absoluto
absoluta es asi:
c:\direccion\libreria\archivo.a

relativa es asi:
..\..\..\direccion\archivo.a


Título: Re: Archivo de audio en C
Publicado por: Baal_30 en 24 Julio 2014, 14:11 pm
Bien, así ya me sale lo que me salía antes, la pestaña de "Makefile.win", pero ahora al compilar me da error:

[Error] C:/Program: No such file or directory
[Error] Files: No such file or directory
[Error] (x86)/Dev-Cpp/MinGW32/lib/libwinmm.a: No such file or directory
recipe for target '"Proyecto1' failed

¿Será que borré la librería sin querer o algo así?  :-\


Título: Re: Archivo de audio en C
Publicado por: daryo en 24 Julio 2014, 15:30 pm
Citar
Será que borré la librería sin querer o algo así?

puede ser pero lo bueno es que eso tendria una solucion sencilla reinstala el dev o instala code blocks :P