Показать сообщение отдельно
Старый 30.09.2010, 23:57   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Получение свойств WAV-файла

Добавил функцию.
;code for B3D:	impersonalis (icq 11-999-51-51)
;info:			https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
;				http://www.gamedev.ru/code/forum/?id=38568

Function imp_MusProperty_GetByteStr$(bank%,start%,l%=4)
	Local s$=""
	Local i%
	Local endi%=start+(l-1)
	For i=start To endi
		s=s+Chr(PeekByte(bank,i))
	Next
	Return s
End Function

Function imp_MusProperty_Short2Int%(a%)
	Local M1%=%00000000000000001000000000000000
	Local M2%=%11111111111111110000000000000000
	Local D%=a And M1
	If D
		a = a Xor M2
	EndIf
	Return a
End Function

Type T_imp_MusProperty_Wav
	Field ChunkID$
	Field ChunkSize%
	Field Format$
	Field Subchunk1ID$
	Field Subchunk1Size%
	Field AudioFormat%
	Field NumChannels%
	Field SampleRate%
	Field ByteRate%
	Field BlockAlign%
	Field BitsPerSample%
	Field Subchunk2ID$
	Field Subchunk2Size%
End Type

Function imp_MusProperty_WavFileProc.T_imp_MusProperty_Wav(filename$)
	Local WP.T_imp_MusProperty_Wav=New T_imp_MusProperty_Wav
	
	Local i%
	Local file%=ReadFile(filename)
	If file=0
		RuntimeError "Cannot open "+filename
	EndIf
	Local RIFF_chunk%=CreateBank(12)
	Local fmt_subchunk%=CreateBank(24)
	Local data_subchunk%=CreateBank(8)
	ReadBytes(RIFF_chunk,file,0,BankSize(RIFF_chunk))
	ReadBytes(fmt_subchunk,file,0,BankSize(fmt_subchunk))
	ReadBytes(data_subchunk,file,0,BankSize(data_subchunk))
	CloseFile(file)
	WP\ChunkID=imp_MusProperty_GetByteStr(RIFF_chunk,0)
	WP\ChunkSize=PeekInt(RIFF_chunk,4)
	WP\Format=imp_MusProperty_GetByteStr(RIFF_chunk,8)
	WP\Subchunk1ID=imp_MusProperty_GetByteStr(fmt_subchunk,0)
	WP\Subchunk1Size=PeekInt(fmt_subchunk,4)
	WP\AudioFormat=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,8))
	WP\NumChannels=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,10))
	WP\SampleRate=PeekInt(fmt_subchunk,12)
	WP\ByteRate=PeekInt(fmt_subchunk,16)
	WP\BlockAlign=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,20))
	WP\BitsPerSample=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,22))
	WP\Subchunk2ID=imp_MusProperty_GetByteStr(data_subchunk,0)
	WP\Subchunk2Size=PeekInt(data_subchunk,4)
	FreeBank(RIFF_chunk)
	FreeBank(fmt_subchunk)
	FreeBank(data_subchunk)
	
	Return WP
End Function

Function imp_MusProperty_IsWav%(WP.T_imp_MusProperty_Wav)
	Return WP\Format="WAVE"
End Function

Function imp_MusProperty_GetWavTimeInSec#(WP.T_imp_MusProperty_Wav)
	Return WP\Subchunk2Size / Float( (WP\BitsPerSample / 8.0) * WP\NumChannels * WP\SampleRate)
End Function
imp_MusProperty_GetWavTimeInSec возвращает время воспроизведения звукового файла в секундах (float). Кстати, неплохо бы потестить (у меня пашет).
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием