class EL_AUDIO_WAVE_BUFFER
Audio wave buffer
note
description: "Audio wave buffer"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2023-07-03 8:18:07 GMT (Monday 3rd July 2023)"
revision: "8"
class
EL_AUDIO_WAVE_BUFFER
inherit
EL_ALLOCATED_C_OBJECT
rename
c_size_of as c_size_of_WAVEHDR,
integer_16_bytes as sample_bytes
redefine
dispose
end
EL_MULTIMEDIA_SYSTEM_C_API undefine copy, is_equal end
EL_MODULE_LOG
create
make
feature {NONE} -- Initialization
make (a_device_handle: MANAGED_POINTER; some_audio_data: MANAGED_POINTER; block_size, a_samples_per_sec: INTEGER)
--
local
status: INTEGER
do
make_default
device_handle := a_device_handle
audio_data := some_audio_data
sample_block_size := block_size
samples_per_sec := a_samples_per_sec
c_set_data (self_ptr, audio_data.item)
c_set_buffer_length (self_ptr, audio_data.count)
status := c_wave_out_prepare_header (device_handle.item, self_ptr)
check
no_error_preparing_header: status = cdef_MMSYSERR_NOERROR
end
end
feature -- Access
sample_count: INTEGER
--
do
Result := audio_data.count // sample_block_size
end
sample_block_size: INTEGER
samples_per_sec: INTEGER
duration: REAL
-- duration ins secs
do
Result := (sample_count / samples_per_sec).truncated_to_real
end
feature -- Basic operations
queue_to_play
--
require
is_prepared: is_prepared
local
status: INTEGER
do
log.enter ("queue_to_play")
status := c_wave_out_write (device_handle.item, self_ptr)
check
no_device_error_occured: status = cdef_MMSYSERR_NOERROR
end
log.exit
end
prepare_disposal
--
require
header_is_prepared: is_prepared
is_done: is_done
local
status: INTEGER
do
status := c_wave_out_unprepare_header (device_handle.item, self_ptr)
is_prepared_for_disposal := status = cdef_MMSYSERR_NOERROR
ensure
prepared_for_disposal: is_prepared_for_disposal
end
feature -- Element change
set_last
--
do
is_last := true
end
feature -- Status query
is_last: BOOLEAN
is_prepared: BOOLEAN
--
do
Result := c_dw_flags (self_ptr).bit_and (cdef_WHDR_PREPARED) /= 0
end
is_done: BOOLEAN
--
do
Result := c_dw_flags (self_ptr).bit_and (cdef_WHDR_DONE) /= 0
end
feature {NONE} -- Disposal
dispose
--
require else
is_prepared_for_disposal: is_prepared_for_disposal
do
Precursor
end
feature {NONE} -- Implementation
is_prepared_for_disposal: BOOLEAN
audio_data: MANAGED_POINTER
device_handle: MANAGED_POINTER
invariant
audio_data_count_multiple_of_sample_block_size: audio_data.count \\ sample_block_size = 0
end