mirror of
https://github.com/schibo/1964js.git
synced 2025-04-02 10:52:54 -04:00
74 lines
No EOL
2.5 KiB
CoffeeScript
74 lines
No EOL
2.5 KiB
CoffeeScript
###1964js - JavaScript/HTML5 port of 1964 - N64 emulator
|
|
Copyright (C) 2012 Joel Middendorf
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.###
|
|
class C1964jsAudio
|
|
|
|
audioContext = undefined
|
|
audioBuffer = undefined
|
|
|
|
constructor: ->
|
|
@sampleNum = 0
|
|
@lastLength = 0
|
|
@audioBuffer = null
|
|
@startTime = null
|
|
@source = null
|
|
@left = null
|
|
@right = null
|
|
try
|
|
@audioContext = new (window.AudioContext || window.webkitAudioContext)() if audioContext is `undefined`
|
|
catch error
|
|
#log "Your browser doesn't support Web Audio."
|
|
@audioContext = "unsupported"
|
|
return false
|
|
|
|
playAudio: (memory, from, length) ->
|
|
return if audioContext is "unsupported"
|
|
|
|
PI_2_400 = 1.0 / (Math.PI * 2.0 * 400.0)
|
|
normalizer = 1.0 / 32768.0
|
|
|
|
# Create/set audio buffer for each chunk
|
|
return if length < 4
|
|
@source = @audioContext.createBufferSource()
|
|
@audioBuffer = @audioContext.createBuffer(2, length / 4, 44100) #if audioBuffer is `undefined`
|
|
@source.buffer = @audioBuffer
|
|
@startTime += @audioBuffer.duration
|
|
@source.connect @audioContext.destination
|
|
@source.loop = false
|
|
@left = @audioBuffer.getChannelData(0)
|
|
@right = @audioBuffer.getChannelData(1)
|
|
|
|
i = from & 0x00FFFFFF
|
|
k = 0
|
|
while k < length
|
|
@left[k+@lastLength] = ((memory.rdramUint8Array[i] << 8 | memory.rdramUint8Array[i + 1]) << 16 >> 16) * normalizer #* PI_2_400
|
|
@right[k+@lastLength] = ((memory.rdramUint8Array[i + 2] << 8 | memory.rdramUint8Array[i + 3]) << 16 >> 16) * normalizer
|
|
i += 4
|
|
k += 1
|
|
|
|
@sampleNum += 1
|
|
@lastLength += length / 4
|
|
# if @sampleNum is 120
|
|
@source.start()
|
|
@sampleNum = 0
|
|
@lastLength = 0
|
|
return true
|
|
return false
|
|
|
|
#hack global space until we export classes properly
|
|
#node.js uses exports; browser uses this (window)
|
|
root = exports ? this
|
|
root.C1964jsAudio = C1964jsAudio |