mejorar mi ejemplo del uso de Mixer y Sound! :(

Consulte acerca de programas, técnicas, algoritmos etc.

mejorar mi ejemplo del uso de Mixer y Sound! :(

Notapor shackra » Sab Mar 06, 2010 10:05 pm

hola :D
hace unos dias estube trabajando en unos ejemplos para el uso de Sound del modulo mixer, hice un pequeño ejemplo que simula unos disparos al hacer click con el puntero del mouse, pero el problema es que el sonido suena mucho despues de que se pinta el "disparo".

aqui les dejo el codigo:
Código: Seleccionar todo
#******************************************************************************
# mixer_sound.py: reproduce musica y sonidos cuando se pulsan los botones del
#                 mouse.
#                 teclas Esc y q para salir, tecla enter para pausar/reproducir
#                 la musica, boton 1 y 3 para los disparos.
#
# TODO: buscar una manera para mejorar la sincronisacion sonido/imagen de los
#       disparos.
#******************************************************************************

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("modulo mixer & Sound")

texto = pygame.font.Font(None, 24)
pygame.mixer.pre_init(44100, -16, 1024)

# creamos una lista para guardar las posiciones de los disparos
disparos = []

pygame.mixer.music.load("moh.ogg")
# cargamos estos efectos de sonido
pistola = pygame.mixer.Sound("pistol.ogg")
shotgun = pygame.mixer.Sound("shotgun.ogg")


tiempo = pygame.time.Clock()
quit = False
pause = False

# reproducimos la musica de fondo
pygame.mixer.music.play(-1)

while not quit:
    tiempo.tick(120)

    for evento in pygame.event.get():
        if evento.type == QUIT:
            quit = True
        elif evento.type == pygame.KEYDOWN:
            if evento.key in [pygame.K_q, pygame.K_ESCAPE]:
                quit = True
            elif evento.key == pygame.K_RETURN:
                if not pause:
                    pygame.mixer.music.pause()
                    pause = True
                else:
                    pygame.mixer.music.unpause()
                    pause = False
        elif evento.type == pygame.MOUSEBUTTONDOWN:
            if evento.button == 1:
                pistola.play()
                posicion = [evento.button, evento.pos]
                if not posicion in disparos:
                    disparos.append(posicion)
                else:
                    print "disparo en el mismo lugar!! lol"
            elif evento.button == 3:
                shotgun.play()
                posicion = [evento.button, evento.pos]
                if not posicion in disparos:
                    disparos.append(posicion)
                else:
                    print "escopetazo en el mismo sitio! lol"

    screen.fill((0,0,0))

    for i in disparos:
        if i[0] == 1:
            pygame.draw.circle(screen, (0, 255, 0), i[1], 16)
        elif i[0] == 3:
            pygame.draw.circle(screen, (255, 0, 0), i[1], 64)

    if not pause:
        miaviso = texto.render("Musica en reproduccion", True, (255, 255, 255))
    else:
        miaviso = texto.render("Musica en pausa", True, (255, 255, 255))

    screen.blit(miaviso, (800/3, 600/3))
    pygame.display.flip()


aqui les dejo un link para descargar el ejemplo con todo y sonidos!:
http://www.4shared.com/file/235697139/33099857/modulo_mixertar.html

tambien estoy haciendo uso de otros modulos y experimentando con los mismos para realizar algo asi como una referencia como otro usuario cuyo nick no recuerdo hizo en su momento.
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Notapor Juan Carlos » Dom Mar 07, 2010 3:22 am

Hola, creo que he encontrado el error. Es que por default el modulo mixer usa un buffer demasiado grande y esto provoca cierto desfasaje.
Para cambiar el tamaño del buffer a uno menor, se utilizar la funcion pre_init.
Pero en tu codigo vos usas dicha funcion?! por que aun hay latencia?

La respuesta resulta sutil, la funcion pre_init() debe ser llamada antes de ejecutarse la llamada init() del modulo pygame.

O sea
Código: Seleccionar todo
import pygame
from pygame.locals import *

#Llamar mixer.pre_init antes que a pygame.init
pygame.mixer.pre_init(44100, -16, 1024)
pygame.init()


En mi computadora lo he probado y funciona.

Saludos
Juan Carlos
 
Mensajes: 97
Registrado: Sab Jul 07, 2007 1:05 pm

Notapor shackra » Lun Mar 08, 2010 7:28 pm

si claro, estoy usando el pre_init(), la documentacion de pygame dice que no hay problema con llamarla despues de pygame.init(), ya que podemos usarla cada vez que queramos cambiar algun argumento que usa el modulo mixer.

te funciona?, hay sincronizacion entre el sonido y la imagen??
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Notapor Juan Carlos » Lun Mar 08, 2010 10:47 pm

si, lo he probado, primero sin realizarle ninguna modificacion y comprobar que en mi computadora tambien hay un desfasaje. Luego realice los cambios y comprobe que el defasaje se redujo notoriamente.

Te propongo el siguiente ejercicio (que de hecho realice yo). Hay un metodo llamado mixer.get_init que te retorna una tupla con los valores con que fue inicializado el modulo mixer.

En tu codigo (o en uno nuevo) escribi esto:
Código: Seleccionar todo
import pygame

pygame.init()
print pygame.mixer.get_init()
pygame.mixer.pre_init(44100, -16, 1024)
print pygame.mixer.get_init()


En mi computadora sale por consola dos veces la siguiente tupla
(22050, -16, 2)

Ahora, proba el siguiente codigo
Código: Seleccionar todo
import pygame

pygame.mixer.pre_init(44100, -16, 1024)
pygame.init()
print pygame.mixer.get_init()


y el resultado fue (44100, -16, 2)
Efectivamente, en el primer codigo el modulo mixer se inicializa con valores por default y la posterior llamada a pre_init no modifica en nada dichos valores.
Mientras, una llamada a pre_init antes que a la llamada a init del modulo pygame setea correctamente los valores.

Te comento que la documentacion que utilize fue la que se encuentra en esta misma pagina http://www.loosersjuegos.com.ar/traducciones/pygame.
La version que estoy usando de pygame es (1, 8, 1) implementado con la version SDL (1, 2, 13).

Que version de pygame/SDL tenes? Los ejemplos que te propuse funcionan como yo digo o en tu computadora hay cambios?

Saludos.
Juan Carlos
 
Mensajes: 97
Registrado: Sab Jul 07, 2007 1:05 pm

Notapor shackra » Dom Abr 11, 2010 10:04 pm

hice lo que me dijiste, parece que mejoro un poco la sincronizacion imagen/sonido pero hay un minipequeñin retraso entre la aparicion de la imagen y cuando suena el sonido (valga la redondancia). gracias de igual forma! :D
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: mejorar mi ejemplo del uso de Mixer y Sound! :(

Notapor yasser_001200 » Mié Sep 01, 2010 5:17 pm

Esta muy bueno. Por fin aprendí como usar los sonidos. Te agradezco mucho.
Vienbeni2 a mi mundo....WAJAJAJAJAJA
yasser_001200
 
Mensajes: 46
Registrado: Lun May 19, 2008 3:28 pm

Re: mejorar mi ejemplo del uso de Mixer y Sound! :(

Notapor shackra » Jue Sep 09, 2010 5:30 am

yasser_001200 escribió:Esta muy bueno. Por fin aprendí como usar los sonidos. Te agradezco mucho.


me alegra ser de ayuda! :D
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado