Waveform aus Puffer zeichnen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Waveform aus Puffer zeichnen

Beitrag von MightyMAC »

Hallo,

ich versuche seit ein paar Tagen eine Wellenform eines Soundsamples zu zeichnen. Beispiele, wie man soetwas direkt aus einen wav-file macht gibt's ja genug, aber direkt aus dem RAM bereitet mir Probleme. Ich benutze folgende Procedure um die Wellenform zu zeichnen und es klappte auch auf Anhieb, aber leider nur bei einigen ausgewählten Samples. Die meisten Samples (obwohl im selben Format (44,1kHz; 16bit; mono)), erzeugen einen Read-Error. Die Samples die klappen sehen gezeichnet auch so aus wie ich mir das vorstelle (siehe Beispiel hier, verglichen mir der Ausgabe von Audacity).

Hier der Code (PB 4.41):

Code: Alles auswählen

Procedure TDAE_DrawSample(Image.l, Sample.l, YZoom.f=0.8)
  *Pointer=IsSound(Sample)
  Blocks.l=GetDXSoundBufferSize(Sample)
  Channels.w=GetDXSoundChannels(Sample)
  Frequenz.l=GetDXSoundFrequency(Sample)
  Bits=GetDXSoundBits(Sample)
;  *DirectSoundBuffer.IDirectSoundBuffer=PeekL(*Pointer)
  XSize=ImageWidth(Image)
  YSize=ImageHeight(Image)
  XFaktor=(Blocks/XSize)/2/Channels
  Debug "---------------------------------------------------------------"
  Debug "Sample: "+Str(Sample)+" - Size: "+Str(XSize)+"x"+Str(YSize)+" - XFaktor: "+Str(XFaktor)
  Debug "LenB:"+Str(Blocks)
  Debug "Kanäle: "+Str(Channels)
  Debug "Rate: "+Str(Frequenz)
  Debug "Bits: "+Str(Bits)
  Debug "Time: "+Str(GetDXSoundRealLength(Sample))+" ms"
  Debug "Pointer="+Str(*Pointer)
  StartDrawing(ImageOutput(Image))
  Box(0,0,XSize,YSize,RGB(255,255,255))
  OldX=XSize : OldY=(YSize/2)
  For t=0 To XSize-1;XSize-1
    delta=t*2*XFaktor*Channels
    ValueL=PeekW(*Pointer-delta)/2
    Debug "Adr="+Str(*Pointer-delta)+" - t="+Str(t)+" - Wert="+Str(PeekW(*Pointer-delta)/2)
;      LineXY(OldX,OldY,XSize-t,(YSize/2)+(ValueL/32767.0)*YSize*YZoom,0)
      LineXY(XSize-t,(YSize/2)-(ValueL/32767.0)*YSize*YZoom,XSize-t,(YSize/2)+(ValueL/32767.0)*YSize*YZoom,0)
;    OldX=XSize-t
;    OldY=(YSize/2)+(ValueL/32767.0)*YSize*YZoom
  Next
  StopDrawing()
EndProcedure
Was mich schon ein bisschen fraglich stimmt ist, warum liegen die Daten vor dem Pointer, also rückwärts angeordnet? Müssten die nicht eigentlich vom Pointer aus in Richtung höhere Adressen laufen? Und warum funktionieren einige und andere nicht? Ist es möglich das manchmal der Soundbuffer in kleine Teile geteilt wird?

Vielleicht hat ja einer 'nen Tipp für mich.
Danke schon mal im Voraus.
Mac
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20