[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] BUG in make_sound()?



hi,

thanks for the awesome bug report.

Is it possible you could send me the file as an attachment?  The email seems to have messed with the formatting.

cheers,




On Fri, May 8, 2009 at 8:31 AM, Brian Brown <brobab@xxxxxxxxx> wrote:
###################################################################################################
# A Pygame BUG Report: (Bug found about May 2009)
#
#  To Pygame People:
#
#   (Best when viewed with a monospaced font.)
#
#   I think I found a glitch/bug . . .
#
#      pygame.sndarray.make_sound() sometimes returns a "channel"?
#
#   Below is a program that can possibley re-do the glitch.
#
###################################################################################################
#
# requirements to run:
#          (python 2.5 or higher)?
#    and:   (pygame 2.8.0 or pygame 2.8.1)?
#    and:    (numpy)?
#
###################################################################################################
#
# On my computer:
#
#   The glitch was found with:  (python 2.5.2 + pygame 2.8.0 + numpy
1.2.1)  and:  (python 2.6.2 + pygame 2.8.1 + numpy 1.3.0 ).
#
#
#   after a while of running (About 2 to 10 minutes), this program
closes and give one of these errors?:
#
#      This one:         TypeError: argument 1 must be
pygame.mixer.Sound, not Channel           <--(common)
#
#      Or this one:      Fatal Python error: (pygame parachute)
Segmentation Fault                   <--(rare)
#                         This application has requested the Runtime
to terminate in an unusual way.
#                           . . .
#
#   (I did a google search to see if anybody else had discovered this glitch--
#     But-- I didn't find any pages about it . . . )
#
###################################################################################################
# My computer stats:
#
#   Windows Vista Home Premium
#    Service Pack 1
#     win32/32-bit Operating System
#      Processor:     Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz 2.00 GHz
#       RAM/memmory:   3.00 GB
#
###################################################################################################
#
# Here's the program:
#

def HE_HE_init():
   global screen
   global screen_x_size
   global screen_y_size
   global channel_max
   if sys.platform == 'win32' or sys.platform == 'win64':
      os.environ['SDL_VIDEO_CENTERED'] = '1'

     # init the pygame.mixer according to the pygame version number:
   versiony_numbery = pygame.version.vernum
   numby = int(str(versiony_numbery[0]) + str(versiony_numbery[1]) +
str(versiony_numbery[2]))
   if numby >= 181: pygame.mixer.init(44100, -16, 1)
   else: pygame.mixer.init(22050, -16, 2)

   pygame.init()
   random.seed()
   channel_max = 5
   pygame.mixer.set_num_channels(channel_max)
   screen_x_size = 640
   screen_y_size = 480
   screen = pygame.display.set_mode((screen_x_size, screen_y_size))
   pygame.mouse.set_visible(1)
   pygame.display.set_caption('BUG? --> pygame.sndarray.make_sound() <-- BUG?')
   pygame.display.flip()


def Lets_ROLL():

   previous_channel = None

     # Some    frequencies/Hz/Cycles-per-second: (ABCDEFGs)
   noteyish = (440, 493.883, 261.626, 293.665, 329.628, 349.228, 391.995,
                440*2.0, 493.883*2.0, 261.626*2.0, 293.665*2.0,
329.628*2.0, 349.228*2.0, 391.995*2.0,
                 440/2.0, 493.883/2.0, 261.626/2.0, 293.665/2.0,
329.628/2.0, 349.228/2.0, 391.995/2.0
                )

   t = time.time()




   while True:   # <-- Main loop


        # Keep program from  running/executing  "too fast":
     while t > time.time(): pass
     t = time.time() + 0.10



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


        # Close the  window/program  if:  [Esc is pressed]  or:  [The
X button is pressed]
     key = pygame.key.get_pressed()
     if key[K_ESCAPE]: END()
     for event in pygame.event.get():
       if event.type == QUIT: END()


      ##### generate/create  and  display/draw  numpy_sound_data: #####

     total_duration_in_seconds  = .25
     samples_per_second          = 22050
     total_amount_of_samples      = total_duration_in_seconds *
samples_per_second
     cicles_per_every_second   = noteyish[int(random.random() * ((7 *
3) - 1) )] #440.0
     numpy_sound_data =  array([0] * int(total_amount_of_samples))


        # setup some variables for  drawing/displaying  numpy_sound_data
     x = 0
     y = 200
     x_dividey = 10
     y_dividey = 1000
     y_addy = 200
     x2 = 0
     y2 = 400
     x2_dividey = 2
     y2_addy_addy = 200


        # yyygr  should cause a "slight" "waver" in the
frequencies/Hz/Cycles-per-second
     yyygr       = 0.00001
     yyygr_speed = 0.0
     #yyygr_speed = (0.0005 / 2.0) - random.random() * 0.0005

     specialy = len(numpy_sound_data) - 1
     specialyy2 = specialy - 1000
     specialyy3 =        0 + 300
     if specialy > 2000: specialy -= 2000

     for n in range(0, len(numpy_sound_data)):

          if yyygr < 0:
            yyygr_speed -= 0.0000005
          elif yyygr > 0:
            yyygr_speed += 0.0000005
          yyygr += yyygr_speed

          wavey_gurgy = ( float(n) * float(cicles_per_every_second +
yyygr)  /  float(samples_per_second) )

          numpy_sound_data[n] = int(    math.sin(  wavey_gurgy *
radians(360)  ) * 20000.0        )


           # This "pinches" the ends of the "numpy_sound_data":
          if n >= specialyy2:
            numpy_sound_data[n] *= (1.0 - (n - specialyy2) / 1000.0)
          if n <= specialyy3:
            numpy_sound_data[n] *= (n / 300.0)

           # Draw/plot two stretched versions of the "numpy_sound_data":
          xa = x
          ya = y
          x = n  / x_dividey
          y = numpy_sound_data[n] / y_dividey + y_addy
          xa2 = x2
          ya2 = y2
          x2 = n / x2_dividey
          y2 = y + y2_addy_addy
          pygame.draw.line(screen, (200, 200, 200), (x, y), (xa, ya))
          pygame.draw.line(screen, (200, 200, 200), (x2, y2), (xa2, ya2))

     pygame.display.flip()






      ###### convert "numpy_sound_data" to pygame.mixer.Sound and
play it: #######


     sound_thing   =   pygame.sndarray.make_sound( numpy_sound_data )
# <-- This should always return a sound, right?


     if previous_channel != None:   previous_channel.fadeout(300) #
<-- Fade out previous sound. (if any)


     print type(sound_thing)                                        #
<-- Should print:  <type 'pygame.mixer.Sound'>


     previous_channel =
pygame.mixer.find_channel(True).play(sound_thing, 0)  # <-- This line
is where the program "should" give an error.











def END():
   print ''
   print 'Program ended?'
   print "###############################################################################"
   print "###############################################################################"
   print ''
   pygame.quit()
   raise SystemExit, ''


import os
import sys
import math
import random
import time
#import gc
#import copy as pythoncopy
#import string
#import struct
#from time import strftime, localtime
#import wave

print ""
print "###############################################################################"
print "###############################################################################"
print "Program started? "
print ""
print ""
print ""
print ""
print ""
try:
                                                              import pygame
                                                              from
pygame.locals import *
                                                              if not
pygame.font:  print '?? "pygame.font" not "found" ??'
                                                              if not
pygame.mixer: print '?? "pygame.mixer" not "found" ??'
                                                              from
pygame import scrap
except: print
'"pygame" not "found"???'
try:
                                                              import
numpy; from numpy import *
except: print
'"numpy" not "found"??? (Oh well! Who cares!)'
#try:
#                                                               import
numarray; from numarray import *
#except: print
'"numarray" not "found"??? (Oh well! Who cares!)'
#try:
#                                                               import
Numeric; from Numeric import *
#except: print
'"numeric" not "found"??? (Oh well! Who cares!)'

HE_HE_init()
Lets_ROLL()
END()

# Thanks for your effort! I hope the bug will be fixed!