[squeak-dev] Building (Linux) VM - with segfaults. that point to audio

Brad Fuller bradallenfuller at gmail.com
Tue Nov 18 00:12:21 UTC 2008


Thanks for the reply, John.

Yeah, I know what THAT code looks like.. it's only my speculation that
the Squeak primitive is calling this function.  My first question was
does "primSoundPlaySamples"  _directly_ call PlaySamplesFromLength in
the ALSA c code? Or, put a better way, how do I tell which smalltalk
method calls which c code function? Is there a table of pointers
somewhere? (sorry, I might have known this before, but I can't
remember and I don't know where this is on the wiki. But, after I send
this msg I'm looking for it again.)

Yeah, the args look correct in Squeak. This is an unmodified image, so
I assume there shouldn't be any problem there. I guess I have to fire
up gdb and see if the args are really correct at that stage. Just was
hoping that someone would tell me that I didn't set up configure
correctly for the make -- or that I missed something in the confugure
to include ALSA in the build. ( I just have the feeling that the ALSA
code is not being executed.,, i.e. it's not a bug in ALSA, but it's
going into the weeds... well. obviously it's going into the weeds, but
not because of ALSA code)


On Mon, Nov 17, 2008 at 3:40 PM, John M McIntosh
<johnmci at smalltalkconsulting.com> wrote:
> GDB is your friend.
>
> PlaySamplesFromAtLength
> is where we take the bytes from squeak and write them to the platform's
> sound logic. In this case for
> sqUnixSoundALSA.c
> the code is below
>
> You need to confirm startIndex, output_channels, output_handle, samples are
> all sane. In debugging past issue with
> the sound API I can say we don't consider if the parms can be bogus as a
> result of attempting to drive
> the sound primitives when we haven't really setup the sound logic properly.
>
> static sqInt  sound_PlaySamplesFromAtLength(sqInt frameCount, sqInt
> arrayIndex, sqInt startIndex)
> {
>  if (output_handle)
>    {
>      void *samples= (void *)arrayIndex + startIndex * output_channels * 2;
>      int   count=   snd_pcm_writei(output_handle, samples, frameCount);
>      if (count < frameCount / 2)
>        {
>          output_buffer_frames_available= 0;
>        }
>      if (count < 0)
>        {
>          if (count == -EPIPE)    /* underrun */
>            {
>              int err;
>              snd(pcm_prepare(output_handle), "sound_PlaySamples:
> snd_pcm_prepare");
>              return 0;
>            }
>          fprintf(stderr, "snd_pcm_writei returned %i\n", count);
>          return 0;
>        }
>      return count;
>    }
>  success(false);
>  return 0;
> }
>
>
>
> On 17-Nov-08, at 3:02 PM, Brad Fuller wrote:
>
>> I'm not any further, but this is what I've found:
>>
>> I seem to get the segfault it SoundPlayer>>playLoop at:
>>
>>                        self primSoundPlaySamples: count from: Buffer
>> startingAt: 1.
>>
>> But, I don\' know really where to go from here. I checked out
>> SoundPlugin and sqUnixSoundALSA.c
>> and they both have the function:
>>
>>  int snd_PlaySamplesFromAtLength(int frameCount, int arrayIndex, int
>> startIndex)
>>
>> which I assume is what is being called from Squeak.
>>
>> When I run 'configure', the audio section that is sent to the terminal
>> looks correct:
>>
>> checking for Advanced Linux Sound Architecture... yes
>> checking for Mac OS X CoreAudio... no
>> ******** disabling vm-sound-MacOSX
>> checking for Network Audio System... no
>> ******** disabling vm-sound-NAS
>> checking for Advanced Linux Sound Architecture... yes
>> checking for SunOS/Solaris audio... no
>> ******** disabling vm-sound-Sun
>> checking for custom sound support... no
>> ******** disabling vm-sound-custom
>>
>> (don't know why ALSA is mentioned twice, though.)
>>
>> Here's the segfault again:
>>
>> Segmentation fault
>>
>> 20547312 [] in >playLoop
>> 20547404 [] in Semaphore>critical:
>> 20547220 BlockContext>ensure:
>> 20547128 Semaphore>critical:
>> 20515212 >playLoop
>> 20515028 [] in >startPlayerProcessBufferSize:rate:stereo:sound:
>> 20515120 [] in BlockContext>newProcess
>> Aborted
>>
>> BTW, it didn't matter when I changed the sample rate to 44100, still
>> had the segfault.
>>
>> I don't know where to turn from here, short of compiling with debug
>> flag on and starting up gdb.
>> Any ideas much appreciated. If someone knows the architecture of what
>> happens when the primitive is called and what should happen in the
>> ALSA plugin code that could be helpful.
>>
>> thanks for reading!
>>
>>
>> --
>> Brad Fuller
>>
>
> --
> ===========================================================================
> John M. McIntosh <johnmci at smalltalkconsulting.com>
> Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
> ===========================================================================
>
>
>
>
>



-- 
Brad Fuller



More information about the Squeak-dev mailing list