queued.bmx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. SuperStrict
  2. Framework SDL.SDLRenderMax2d
  3. '
  4. ' Choose SDL or MiniAudio backend
  5. Import Audio.AudioSDL
  6. 'Import Audio.AudioMiniAudio
  7. Graphics 800,600,0
  8. Global sound:TSound = LoadSound(Null, SOLOUD_SOUND_QUEUED)
  9. Local driver:TSoloudAudioDriver = TSoloudAudioDriver(GetAudioDriver())
  10. Local so:TSoLoud = driver._soloud
  11. Local queue:TSLQueued = TSLQueued(TSoloudSound(sound)._sound)
  12. 'Local buf:Byte[]
  13. ' create a buffer with 1 second of sine wave at 44100hz C5, where Sin() takes degrees
  14. Local sampleRate:Int = 44100
  15. Local frequency:Float = sampleRate / 168.0
  16. Local samplesForOneSecond:Int = sampleRate * 2
  17. ' create byte buffer large enough to hold the float samples
  18. Local data:Byte[samplesForOneSecond * 4]
  19. ' create a float pointer to the byte buffer
  20. Local floatPtr:Float Ptr = Float Ptr(data)
  21. For Local i:Int = 0 Until samplesForOneSecond
  22. Local sample:Float = Sin(i * (360.0 * frequency / sampleRate))
  23. floatPtr[i] = sample ' store the float sample directly
  24. Next
  25. queue.writeData(data, size_t(samplesForOneSecond * 4))
  26. queue.writeData(data, size_t(samplesForOneSecond * 4))
  27. so.setVisualizationEnable(True)
  28. Global channel:TChannel = PlaySound(sound)
  29. Local volume:Float = 1
  30. Local ms:Int = MilliSecs()
  31. While not keydown(KEY_ESCAPE)
  32. Cls
  33. Local ts:Int = MilliSecs()
  34. local size:Size_T = queue.size()
  35. If size < 20000 Then
  36. queue.writeData(data, size_t(samplesForOneSecond * 4))
  37. ms = ts
  38. EndIf
  39. Local StaticArray wavData:Float[256]
  40. Local StaticArray fftData:Float[256]
  41. Local buf:Float Ptr = so.getWave()
  42. MemCopy(wavData, buf, 246 * 4)
  43. buf = so.calcFFT()
  44. MemCopy(fftData, buf, 256 * 4)
  45. SetColor(255, 255, 255)
  46. DrawText samplesForOneSecond * 4, 10, 10
  47. DrawText size, 10, 20
  48. For Local i:int = 0 Until 256
  49. Local d:Float = wavData[i]
  50. Local height:Float = d * 128
  51. If d > 0 Then
  52. DrawRect( 30 + i * 3, 200 - height, 3, height )
  53. Else
  54. DrawRect( 30 + i * 3, 200, 3, Abs(height) )
  55. End If
  56. Next
  57. SetColor(248, 58, 10)
  58. For Local i:int = 0 Until 246
  59. Local d:Float = fftData[i]
  60. Local height:Float = Min(200, d * 2)
  61. DrawRect( 30 + i * 3, 200 - height, 2, height )
  62. Next
  63. SetColor(255, 255, 255)
  64. Local y:Int = 350
  65. DrawRect(20, y, 760, 20)
  66. SetColor(0, 0, 0)
  67. DrawRect(21, y + 1, 758, 18)
  68. Flip
  69. Wend