On, Tue Feb 19, 2008, Lenard Lindstrom wrote:
> Marcus von Appen wrote:
>> On, Tue Feb 19, 2008, Alistair Buxton wrote:
>>
>>
>>>> I'm an oblivious idiot :-). A buffer method's already available in the
>>>> current SVN tree. You can use pygame.Sound (your_buffer) safely, the
>>>> buffer just has to match the mixer criteria.
>>>>
>>>> Due to the SDL_Mixer implementation however, the buffer will be copied,
>>>> so a manipulation of the buffer object after creating the Sound will not
>>>> have any impact on it.
>>>>
>>>>
>>> I'm looking at that code right now. It looks like it tries to copy it,
>>> and if it can't, it raises an exception. But then there is a block of
>>> code right after which would load it in place, but can not be reached
>>> currently, because the previous code returns on error. Correct? So I'm
>>> guessing this is already WIP by somebody :)
>>>
>>
>> The code should be fully functional. To which unreachable lines do you
>> refer?
>>
>>
> Found it. The code never reaches the part that handles file objects, since
> mixer.c:881,882 return an error if the object has no buffer interface:
>
> if (PyObject_AsReadBuffer (file, &buf, &buflen) == -1)
> return -1;
>
> The following changes to examples\sound.py confirm it.
>
> file = open(os.path.join('data', 'secosmic_lo.wav'), 'rb')
> try:
> sound = mixer.Sound(file)
> finally:
> file.close()
>
> Running the modified sound.py raises an exception:
>
> Traceback (most recent call last):
> File "sound.py", line 21, in <module>
> sound = mixer.Sound(file)
> TypeError: expected a readable buffer object
Sure, because file() and open() return file objects, not buffers. The
Python File object do not implement a buffer interface, but you can
easily help yourself using
fp = open (your_file)
sound = pygame.mixer.Sound ((buffer(fp.read ())))
Regards
Marcus
Attachment:
pgpYX5ydzM7KW.pgp
Description: PGP signature