'  Blade Type of DLL Interface for Lame encoder
' 
'  Copyright (c) 1999-2002 A.L. Faber
    '  Based on bladedll.h version 1.0 written by Jukka Poikolainen
' 
'  This library is free software; you can redistribute it and/or
'  modify it under the terms of the GNU Lesser General Public
'  License as published by the Free Software Foundation; either
'  version 2 of the License, or (at your option) any later version.
'  
'  This library 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
'  Lesser General Public License for more details.
'  
'  You should have received a copy of the GNU Lesser General Public
'  License along with this library; if not, write to the
'  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
'  Boston, MA  02111-1307, USA.
' *** adapted to FreeBasic by Electrik

#include "windows.bi" 
#inclib "lame_enc"
#ifndef __BLADEDLL_BI__
#define __BLADEDLL_BI__
#pragma once

' форматы кодирования
#define BE_CONFIG_MP3 0
#define BE_CONFIG_LAME			256

' объявление структур
type as dword HBE_STREAM
type as HBE_STREAM ptr PHBE_STREAM
type as dword BE_ERR

' коды ошибок
#define  BE_ERR_SUCCESSFUL &h00000000
#define BE_ERR_INVALID_FORMAT &h00000001
#define		BE_ERR_INVALID_FORMAT_PARAMETERS &h00000002
#define		BE_ERR_NO_MORE_HANDLES &h00000003
#define		BE_ERR_INVALID_HANDLE &h00000004
#define		BE_ERR_BUFFER_TOO_SMALL &h00000005

' прочие константы
#define BE_MAX_HOMEPAGE 128

' format specific variables
#define BE_MP3_MODE_STEREO 0 ' стерео режим
#define BE_MP3_MODE_JSTEREO 1 ' джоинт стерео
#define BE_MP3_MODE_DUALCHANNEL 2 ' двойной канал
#define BE_MP3_MODE_MONO 3 ' моно режим

#define MPEG1 1 ' версия мпег
#define MPEG2 0 ' версия мпег. низкие битрейты и частоты дискретизации

#define CURRENT_STRUCT_VERSION 1
#define CURRENT_STRUCT_SIZE sizeof(BE_CONFIG)	' - к настоящему времени 331 байта

enum VBRMETHOD
VBR_METHOD_NONE = -1 ' отключить переменный битрейт
VBR_METHOD_DEFAULT = 0
VBR_METHOD_OLD = 1
VBR_METHOD_NEW = 2
VBR_METHOD_MTRH = 3
VBR_METHOD_ABR = 4
end enum

enum LAME_QUALITY_PRESET
LQP_NOPRESET =-1 ' использовать без готовых предустановок

' готовые предустановки качества звука и скорости кодирования
LQP_NORMAL_QUALITY = 0 ' нормальное качество
LQP_LOW_QUALITY = 1 ' низкое качество
LQP_HIGH_QUALITY = 2 ' высокое качество
LQP_VOICE_QUALITY = 3 ' качество для голоса
LQP_R3MIX = 4
LQP_VERYHIGH_QUALITY = 5 ' очень высокое качество
LQP_STANDARD = 6 ' стандарт
LQP_FAST_STANDARD = 7 ' стандарт, быстрое кодирование
LQP_EXTREME = 8 ' предел
LQP_FAST_EXTREME = 9 ' предел, быстрое кодирование
LQP_INSANE = 10 ' скоростное кодирование
LQP_ABR = 11 ' average bytrate
LQP_CBR = 12 ' постоянный битрейт
LQP_MEDIUM = 13
LQP_FAST_MEDIUM = 14

' новые готовые предустановки
LQP_PHONE = 1000 ' как по телефону
LQP_SW = 2000
LQP_AM = 3000 ' как средневолновый приемник
LQP_FM = 4000 ' как фм радио
LQP_VOICE = 5000 ' для голоса
LQP_RADIO = 6000 ' радио
LQP_TAPE = 7000 ' как на магнитофоне
LQP_HIFI = 8000 ' хай фай
LQP_CD = 9000 ' качество как у компакт диска
LQP_STUDIO = 10000 ' студийное качество
end enum

			type MP3 field = 1 ' BE_CONFIG_MP3 
as dword dwSampleRate  ' допустимо 48000, 44100 и 32000 килогерц
			as byte byMode  ' режимы каналов, BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO. см. выше
			as word wBitrate  ' допустимо 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 и 320 килобит
			as BOOL	bPrivate ' флажки. часный
as BOOL	bCRC ' контрольная сумма
			as BOOL	bCopyright ' авторское право
			as BOOL	bOriginal 
end type 

type LHV1 field = 1 ' LAME header version 1 

		' информация о структуре
			as dword			dwStructVersion ' версия структуры
			as dword			dwStructSize ' размер структуры

' базовые установки енкодера
			as dword			dwSampleRate		' частота дискретизации для входного файла
			as dword			dwReSampleRate		' частота- для ресемплирования, 0=выбирается енкодером
			as LONG			nMode				' режимы каналов, BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO. см. выше
			as dword			dwBitrate			' устанавливает постоянный битрейт, для переменного минимальный
			as dword			dwMaxBitrate		' постоянный битрейт игнорируется, устанавливает максимальный переменный битрейт
			as LONG			nPreset			' используйте одну из готовых предустановок LAME_QUALITY_PRESET enum
			as dword			dwMpegVersion		' версия mpeg. используйте, MPEG-1 или  MPEG-2
			as dword			dwPsyModel			' FUTURE USE, SET TO 0
			as dword			dwEmphasis			' FUTURE USE, SET TO 0

' установка флагов в поток
			as BOOL			SbPrivate			' установить часный бит (TRUE/FALSE)
			as BOOL			IbCRC				' вставить контрольную сумму (TRUE/FALSE)
			as BOOL			SbCopyright			' установить бит авторское право (TRUE/FALSE)
			as BOOL			bOriginal			' Set Original Bit (TRUE/FALSE)
			
			' VBR STUFF
			as BOOL			bWriteVBRHeader	 ' WRITE XING VBR HEADER (TRUE/FALSE)
			as BOOL			bEnableVBR			' включить переменный битрейт (TRUE/FALSE)
			as INTEGER				nVBRQuality		' качество при переменном битрейте 0..9
			as dword			dwVbrAbr_bps		' Использовать ABR вместо nVBRQuality
			as VBRMETHOD		nVbrMethod ' метот vbr
		as BOOL			bNoRes				' Disable Bit resorvoir (TRUE/FALSE)

			' MISC SETTINGS
			as BOOL			bStrictIso			' Use strict ISO encoding rules (TRUE/FALSE)
			as WORD			nQuality			' установка качества, HIGH BYTE should be NOT LOW byte, otherwhise quality=5

			' FUTURE USE	, SET TO 0, align structure to 331 bytes
			as BYTE			btReserved(255-4*sizeof(dword) - sizeof( WORD )-1)
end type

type AAC  field = 1 ' aac
			as dword	dwSampleRate ' частота дискретизации
		as BYTE	byMode ' режим каналов
			as WORD	wBitrate ' битрейт
			as BYTE	byEncodingMethod ' метод кодирования
end type

	union FORMAT field = 1 'format
as MP3 mp3
as LHV1 lhv1
as AAC aac
end union

type BE_CONFIG field = 1
	as dword dwConfig  ' BE_CONFIG_XXXXX
' поддерживается BE_CONFIG

as FORMAT format
end type

		
  type as BE_CONFIG ptr PBE_CONFIG


type BE_VERSION

	' BladeEnc DLL номер версии
	as BYTE	byDLLMajorVersion
	as BYTE	byDLLMinorVersion

	' BladeEnc номер версии движка (engine)
	as BYTE	byMajorVersion
	as BYTE	byMinorVersion

	' дата релиза DLL 
	as BYTE	byDay	
as BYTE	byMonth
	as WORD	wYear

	'BladeEnc	домашняя страница
	as zstring * BE_MAX_HOMEPAGE + 1 zHomepage

	as BYTE	byAlphaLevel
	as BYTE	byBetaLevel
	as BYTE	byMMXEnabled

	as BYTE	btReserved(125-1)
end type

type as BE_VERSION ptr PBE_VERSION

extern "c"

' функция инициализации потока
declare function beInitStream alias "beInitStream" _
(byval pbeConfig as PBE_CONFIG, byval dwSamples as PDWORD, _
byval dwBufferSize as PDWORD, byval phbeStream as PHBE_STREAM) as BE_ERR

' функция кодирования частей данных
declare function beEncodeChunk alias "beEncodeChunk" _
(byval hbeStream as HBE_STREAM, byval nSamples as DWORD, _
byval pSamples as PSHORT, byval pOutput as PBYTE, _
byval pdwOutput as PDWORD )as BE_ERR

'added for floating point audio  -- DSPguru, jd
declare function beEncodeChunkFloatS16NI alias "beEncodeChunkFloatS16NI" _
(byval hbeStream as HBE_STREAM, byval nSamples as DWORD, _
byval buffer_l as PFLOAT, byval buffer_r as PFLOAT, _
byval pOutput as PBYTE, byval pdwOutput as PDWORD) as BE_ERR

' функция деинициализации потока
declare function beDeinitStream alias "beDeinitStream" _
(byval hbeStream as HBE_STREAM, byval pOutput as PBYTE, _
byval pdwOutput as PDWORD) as BE_ERR

' функция закрытия потока
declare function beCloseStream alias "beCloseStream" _
(byval hbeStream as HBE_STREAM) as BE_ERR

' функция получения версии енкодера
declare function beVersion alias "beVersion" _
(byval pbeVersion as PBE_VERSION) as PCVOID

declare function beWriteVBRHeader alias "beWriteVBRHeader" _
(byval lpszFileName as LPCSTR) as BE_ERR
declare function beFlushNoGap alias "beFlushNoGap" _
(byval hbeStream as HBE_STREAM, byval pOutput as PBYTE, _
byval pdwOutput as PDWORD) as BE_ERR
declare function beWriteInfoTag alias "beWriteInfoTag" _
(byval hbeStream as HBE_STREAM, byval lpszFileName as LPCSTR) as BE_ERR
end extern
#endif
