[Bennu Module] mod_beep

Started by FreeYourMind, February 22, 2010, 08:13:02 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

No Splinter, sigues insistiendo en eso, tiene que ser un thread/beep... Lo que tu dices ya lo he probado y no funciona.

SplinterGU

#76
pero hombre, si que funciona, mira la funcion de carga de graficos en background...

no podes hacer muchos threads lanzando sonidos, porque el parlante no es una placa de sonido donde le podes mandar comandos, es un dispositivo que suena mediante envios de ondas, pulsar, no pulsar... si vos quisieras enviar varios beeps a la vez, deberias mezclar la onda y manejarla la "excitacion" del parlante a mano, haciendo los OUTs adecuados al mismo, no podes enviar beeps y pretender que funcione...

tiene que ser un hilo que vaya consumiendo de una lista (buffer) de notas, y la funcion principal va llenando esa cola cada vez que mandas un beep... tal cual lo hace el sistema operativo con el buffer de teclado u otras tantas cosas que tienen buffers...

necesitas usar y comprender esto http://en.wikipedia.org/wiki/Circular_buffer

mas links

http://www.proz.com/kudoz/german_to_spanish/computers:_software/845350-ringspeicher.html

http://www.todopic.com.ar/foros/index.php?topic=23922.0

http://www.infor.uva.es/~benja/apuntes-semaforos-POSIX.html

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_Ada/Tareas/Ejemplos
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Es muy facil hacer la prueba para saber que no funcionaba, fue lo primero que hize, en la funcion interna beep le pongo multithread, depues en lugar de llamar un beep, llamo unos cuantos (o sea si tiene multithread, todo lo que hace dentro de ella tendria que estar en una thread, en este caso todos los beeps que pongo dentro....), despues en el prg llamos sólo una vez a la funcion beep, y como sabes esta fue creada en una thread y va ejecutar todos los beeps que tiene dentro. Pues bien, loe ejecuta, pero sigue pausando el resto de Bennu.

Ahora mismo, creo una thread por cada beep, y si funciona, lo que pasa es que se descuadran un poco, por ejemplo, al hacer un beep escribo al mismo tiempo en la consola, los prints salen todos correctamente, pero se nota que algunos no terminan de imprimirse, es como si se cancelaran, lo mismo con los beeps, si pongo pocos toca bien, pero con muchos, estos ultimos ya ni suenan. Luego os pongo unas pantallas, donde verás el recorte en los prints, ya que no puedes probar el modulo porque es para windows, pero si alguien se ofrece para probarlo, os pongo tb la beta de la dll.

FreeYourMind

Lo unico que seria necesario es crear una cola, o un sistema que sólo permita ejecutar el siguiente thread/beep cuando el anterior haya terminado...

SplinterGU

#79
Quote from: FreeYourMind on May 11, 2010, 03:00:37 PM
Lo unico que seria necesario es crear una cola, o un sistema que sólo permita ejecutar el siguiente thread/beep cuando el anterior haya terminado...

y asi volves a lo que digo... a ver... tratare de explicarlo bien facil...

1) programa principal bennu
2) thread controlador de beeps (1 solo y unico thread en toda la ejecucion)
3) cola-fifo/buffer-circular de lectura y escritura

funcionamiento

1) arranca bennu
2) carga dll mod_beep y en ese momento crea thread que cada X tiempo va revisar la cosa por disponibilidad de datos. Para esto se necesitan punteros de inicio de datos y fin de datos dentro de la cola, tamaño de la cola, un flag para indicar que hay datos disponibles y si queres cantidad de elementos en la cola. Tambien te sugiero un semaforo o mutex para que no te compliques la vida, pero solo este semaforo o mutex debe ser usado para leer/escribir los valores en la cola NO DEBE USARSE PARA HACER EL BEEP real.
3) ejecutas la funcion beep (desde prg) y esta funcion beep (prg) escribe un dato en la cola (NO CREA NINGUN THREAD NI ESPERA NADA DE LOS THREADS), solo escribe
4) como tenemos el thread controlador esperando datos de la cola, los leera cuando esten disponibles y los ejecutara, y actualizara las variables de referencia segun vaya consumiendo (bloquea, lee, "si hay datos actualiza variables que indican que leyo", desbloquea, "si hay datos hace el beep-sound", y vuelve a iniciar el ciclo... mira bien que cuando hace el beep-sound no esta bloqueado el semaforo/mutex, esto es importantisimo.)

Esto es como debe ser la implementacion, imposible que te detenga el programa principal si lo haces de esta forma, ahora si creas un thread puede que esa creacion de thread este esperando la finalizacion del mismo, todo depende como lo haces.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Grácias por la explicación, de verdad ya tenia claro más o menos todos esos pasos que hay que hacer, el problema no es entenderlo, pero mas bien implementarlo :)

A ver si lo consigo, seria fenomenal conseguir implementarlo y de paso hacer beeps compatibles con linux, y lo mejor de todo portarlo a la Wiz por algun sistema de emulación (aunque igual se podria hacer más facilmente con revisiones de los modulos midi o notes...). DCElso tiene una cola en el suyo igual le hecho luego un vistazo :))

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Buenas,
en mis primeros pinitos con Linux y Bennu, he compilado la primera version de la Dll para Linux, no utiliza el mismo codigo que la version Windows porque esta utiliza encabecados/dependencias de Linux para tal efecto, pero el resultado tendria que ser similar.

De momento es una beta ya que aunque el ejemplo Bennu tenga beeps con freq. y duracion como parametro, internamente solo leera el primer parametro, o sea, la frequencia, pero para la primera prueba esto no es importante.

Os pongo el test, con el modulo y todo lo necesario para compilar el test y probar.

Necesito vuestra ayuda

Notas:

1 - A mi no me tocan los Beeps en Linux, he instalado el beep que existe para Linux y que se ejecuta en la linea de comandos y este no suena nada.
Con esto quiero decir que aunque este modulo funcione, yo no puedo saberlo.

2 - El problema que tengo aparte del comentado, es que a mi no hay forma que me encuentre el modulo, donde se tienen que poner los modulos ? Lo he puesto en todo sitio, en todas las carpetas lib de Bennu que he encontrado y tambien en la carpeta del test y nada, no me encuentra el fichero... y eso que lo he compilado en la misma maquina y me lo genera con el nombre correcto.

PS: Quiten la extension rar al fichero.

FreeYourMind

Bueno, una semana despúes y total desinteres. Ya digo lo mismo que Drumpi, si nadie me ayuda tendré que prescindir de trastear con Linux y los ports de modulos de Bennu  ;D

SplinterGU

todos estamos con cosas... y yo necesito ponerme a terminar unas cosas para bennu...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

l1nk3rn3l

debe ser que beep usa el speaker en linux y no la tarjeta de sonido..

deberias probarlo en windows o pasame por aqui los fuentes y lo pruebo en windows

adjuntame .c y .prg

Gracias

FreeYourMind

Te estas liando linker :) El de Windows funciona (los fuentes de esta version 0.01, equivalente, sin multithread y sólo para windows estan en mi pagina).

El de Linux, aunque el objetivo es que el modulo tenga las mismas prestaciones que el de windows, internamente no utiliza el mismo código fuente, ya que tira de encabezados de Linux.

He leido en otro foro que hay que habilitar esta funcion de speaker en linux, pero no lo he probado aún, hay un programa llamado beep, que se descarga de los repositorios y te permite tocar beeps en la linea de comandos, con esto tambien sirve para saber si tu linux tiene los beeps habilitados, ya que a mi tampoco me suena con este.

Drumpi

Siento no poder echar una mano, pero estoy con el proyecto. No me importa de vez en cuando cambiar código c por Bennu, pero es que probar un módulo que se oye en toda la casa es muy difñicil de "disimular" para que no se den cuenta mis "jefes".
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind

Sobre Linux, no hay aqui nadie que pueda ver si le funcionan los Beeps ?

Me han dicho que han quitado el módulo del "speaker" en la últimas versiones. Alguien puede probar el programa Beep que se ejecuta en una terminal (se obtiene de los repositorios) a ver si suena ???

En caso negativo, con "modprobe pcspkr" en un terminal se puede habilitar el speaker. Si se quiere que se ejecute al arrancar editamos el fichero /etc/modprobe.d/blacklist.conf y comentamos la linea que pone: blacklist pcskpr

josebita

No lo puedo probar (exámenes...) pero es cierto que desde hace un par de versiones -en Ubuntu al menos- el módulo de salida de sonido de pcspeaker viene en la lista negra => Aunque tu hardware tenga soporte, no se carga el módulo automáticamente.