class EL_WAVEFORM_FORMAT
Waveform format
note
	description: "Waveform format"
	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:03:11 GMT (Monday 3rd July 2023)"
	revision: "7"
		
		class
	EL_WAVEFORM_FORMAT
inherit
	EL_ALLOCATED_C_OBJECT
		rename
			c_size_of as c_size_of_wave_formatex
		end
	EL_WAVEFORM_FORMAT_ABS undefine copy, is_equal end
	EL_MULTIMEDIA_SYSTEM_C_API undefine copy, is_equal end
create
	make, make_default, make_16_bit_mono_PCM
feature {NONE} -- Initialization
	make (header: EL_AUDIO_WAVE_HEADER)
		do
			make_default
			set_samples_per_sec (header.samples_per_sec)
			set_bits_per_sample (header.bits_per_sample)
			set_format (header.format)
			set_num_channels (header.num_channels)
			set_block_align
			set_average_bytes_per_sec
			set_extra_format_info_size (0)
		end
	make_16_bit_mono_PCM (samples_per_sec_count: INTEGER)
			--
		do
			make_pcm
			set_num_channels (1)
			set_bits_per_sample (16)
			set_samples_per_sec (samples_per_sec_count)
			set_block_align
			set_average_bytes_per_sec
		ensure
			average_bytes_per_sec_valid: average_bytes_per_sec = samples_per_sec * block_align
			block_align_valid: block_align = num_channels * bits_per_sample // 8
		end
	make_pcm
			--
		do
			make_default
			set_format (PCM_format)
			set_extra_format_info_size (0)
		end
feature -- Access
	buffer_size_for_duration (milliseconds: INTEGER): INTEGER
			-- Buffer size required for duration of milliseconds
		local
			samples_in_duration_count: INTEGER
		do
			samples_in_duration_count := (milliseconds.to_real * samples_per_sec.to_real / 1000.0).rounded
			Result := samples_in_duration_count * block_align
		end
	format: INTEGER_16
			--
		do
			Result := c_format (self_ptr).to_integer_16
		end
	num_channels : INTEGER
			--
		do
			Result := c_num_channels (self_ptr)
		end
	samples_per_sec: INTEGER
			--
		do
			Result := c_samples_per_sec (self_ptr)
		end
	bits_per_sample: INTEGER
			--
		do
			Result := c_bits_per_sample (self_ptr)
		end
	average_bytes_per_sec: INTEGER
			--
		do
			Result := c_average_bytes_per_sec (self_ptr)
		end
	block_align: INTEGER
			--
		do
			Result := c_block_align (self_ptr)
		end
feature -- Element change
	set_format (a_format: INTEGER)
			--
		require
			valid_format: is_valid_format (a_format)
		do
			c_set_format (self_ptr, a_format)
		end
	set_num_channels (number: INTEGER)
			--
		do
			c_set_num_channels (self_ptr, number)
		end
	set_samples_per_sec (samples_per_sec_count: INTEGER)
			--
		do
			c_set_samples_per_sec (self_ptr, samples_per_sec_count)
		end
	set_bits_per_sample (bits: INTEGER)
			--
		do
			c_set_bits_per_sample (self_ptr, bits)
		end
	set_extra_format_info_size (size_byte_count: INTEGER)
			--
		do
			c_set_cb_size (self_ptr, size_byte_count)
		end
	set_block_align
			--
		do
			c_set_block_align (self_ptr, num_channels * bits_per_sample // 8)
		end
	set_average_bytes_per_sec
			--
		do
			c_set_average_bytes_per_sec (self_ptr, samples_per_sec * block_align)
		end
invariant
	valid_average_bytes_per_sec: c_average_bytes_per_sec (self_ptr) = c_samples_per_sec (self_ptr) * c_block_align (self_ptr)
	valid_block_align: c_block_align (self_ptr) = c_num_channels (self_ptr) * c_bits_per_sample (self_ptr) // 8
end