Wie lame_enc.dll nutzen ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Wie lame_enc.dll nutzen ?

Beitrag von c4s »

Momentan versuche ich die lame_enc.dll in PureBasic zu benutzen. Dafür muss ich erstmal die Konstanten und Strukturen definieren...und hier fängt mein Problem schon an.
Lame wird nur als C-Quellcode veröffentlicht und ich habe eigentlich keine Ahnung davon. Hinzu kommt, dass ich bisher noch nie mit Dlls gearbeitet habe. :roll:

Hier mein aktueller Fortschritt:

Code: Alles auswählen

;- Constants
;{
;{ Encoding formats
#BE_CONFIG_MP3 = 0
#BE_CONFIG_LAME = 256
;}

;{ Error codes
#BE_ERR_SUCCESSFUL = $00000000
#BE_ERR_INVALID_FORMAT = $00000001
#BE_ERR_INVALID_FORMAT_PARAMETERS = $00000002
#BE_ERR_NO_MORE_HANDLES = $00000003
#BE_ERR_INVALID_HANDLE = $00000004
#BE_ERR_BUFFER_TOO_SMALL = $00000005
;}

;{ Other constants
#BE_MAX_HOMEPAGE = 128
;}

;{ Format specific variables
#BE_MP3_MODE_STEREO = 0
#BE_MP3_MODE_JSTEREO = 1
#BE_MP3_MODE_DUALCHANNEL = 2
#BE_MP3_MODE_MONO = 3
;}

#MPEG1 = 1
#MPEG2 = 0

#CURRENT_STRUCT_VERSION = 1
#CURRENT_STRUCT_SIZE = 331 ;SizeOf(BE_CONFIG)  ; Is currently 331 bytes

; 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

; 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
#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
;}


;- Structures
;{
Structure BE_CONFIG
	dwConfig.l

	StructureUnion
		Structure mp3
			dwSampleRate.l
			byMode.b
			wBitrate.w
			BOOL	bPrivate
			BOOL	bCRC
			BOOL	bCopyright
			BOOL	bOriginal
		EndStructure

		Structure LHV1
			; Structure INFORMATION
			dwStructVersion.l
			dwStructSize.l

			; BASIC ENCODER SETTINGS
			dwSampleRate.l
			dwReSampleRate.l
			nMode.l
			dwBitrate.l
			dwMaxBitrate.l
			nPreset.l
			dwMpegVersion.l
			dwPsyModel.l
			dwEmphasis.l

			; BIT STREAM SETTINGS
			BOOL			bPrivate
			BOOL			bCRC
			BOOL			bCopyright
			BOOL			bOriginal

			; VBR STUFF
			BOOL			bWriteVBRHeader
			BOOL			bEnableVBR
			nVBRQuality.l
			dwVbrAbr_bps.l
			VBRMETHOD		nVbrMethod
			BOOL			bNoRes

			; MISC SETTINGS
			BOOL			bStrictIso
			nQuality.w

			; FUTURE USE, SET To 0, align strucutre To 331 bytes
			btReserved.b{255 - 4 * SizeOf(Long) - SizeOf(Word)}
		EndStructure

		Structure aac
			dwSampleRate.l
			byMode.b
			wBitrate.w
			byEncodingMethod.b
		EndStructure
	EndStructureUnion
EndStructure

Structure BE_VERSION
	; BladeEnc DLL Version number
	byDLLMajorVersion.b
	byDLLMinorVersion.b

	; BladeEnc Engine Version Number
	byMajorVersion.b
	byMinorVersion.b

	; DLL Release date
	byDay.b
	byMonth.b
	wYear.w

	; BladeEnc	Homepage URL
	zHomepage.a{#BE_MAX_HOMEPAGE + 1}

	byAlphaLevel.b
	byBetaLevel.b
	byMMXEnabled.b

	btReserved.b{125}
EndStructure
;}


Prototype beInitStream(*pbeConfig.BE_CONFIG, *dwSamples.l, *dwBufferSize.l, *phbeStream.BE_STREAM)
Prototype beEncodeChunk(hbeStream.BE_STREAM, nSamples.l, *pSamples.w, *pOutput.b, *pdwOutput.l)

; Added for floating point audio  -- DSPguru, jd
Prototype beEncodeChunkFloatS16NI(hbeStream.BE_STREAM, nSamples.l, *buffer_l.f, *buffer_r.f, *pOutput.b, *pdwOutput.w)
Prototype beDeinitStream(hbeStream.BE_STREAM, *pOutput.b, *pdwOutput.l)
Prototype beCloseStream(hbeStream.BE_STREAM)
Prototype beVersion(*pbeVersion.BE_VERSION)
Prototype beWriteVBRHeader(lpszFileName.s)
Prototype beFlushNoGap(hbeStream.BE_STREAM, *pOutput.b, *pdwOutput.l)
Prototype beWriteInfoTag(hbeStream.BE_STREAM, lpszFileName.s)

LibraryNr = OpenLibrary(#PB_Any, "lame_enc.dll")
If LibraryNr
; [...]
Quellen:
Definitionsdatei: http://lame.cvs.sourceforge.net/viewvc/ ... iew=markup
Readme über Benutzung der Dll: http://lame.cvs.sourceforge.net/viewvc/ ... erface.htm


Meine eigentlichen Fragen sind nun: Wie kann ich BOOL umsetzen? Wie werden die Funktionen richtig definiert? Was hat es mit dieser StructureUnion auf sich? (Habe ich den bisherigen Code richtig übersetzt?)
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie lame_enc.dll nutzen ?

Beitrag von ts-soft »

Ehrlich gesagt ist es mir im moment zuviel Arbeit, da ich es nicht benötige :wink:
Ich habe Dir aber einen Anfang geschaffen. Falls Du es zuende stellen solltest, wäre
es nett, wenn Du es dem Forum zur Verfügung stellst.

Hier der Code:

Code: Alles auswählen

Enumeration   ; short_block_t
  #short_block_not_set = -1
  #short_block_allowed = 0
  #short_block_coupled
  #short_block_dispensed
  #short_block_forced
EndEnumeration

Structure lame_global_struct
  class_id.l
  num_samples.l
  num_channels.l
  in_samplerate.l
  out_samplerate.l
  scale.f
  scale_left.f
  scale_right.f
  analysis.l
  bWriteVbrTag.l
  decode_only.l
  quality.l
  mode.l
  force_ms.l
  free_format.l
  findReplayGain.l
  decode_on_the_fly.l
  write_id3tag_automatic.l
  brate.l
  compression_ratio.f
  copyright.l
  original.l
  extension.l
  emphasis.l
  error_protection.l
  strict_ISO.l
  disable_reservoir.l
  quant_comp.l
  quant_comp_short.l
  experimentalY.l
  experimentalZ.l
  exp_nspsytune.l
  preset.l
  VBR.l
  VBR_q_frac.f
  VBR_q.l
  VBR_mean_bitrate_kbps.l
  VBR_min_bitrate_kbps.l
  VBR_max_bitrate_kbps.l
  VBR_hard_min.l
  lowpassfreq.l
  highpassfreq.l
  lowpasswidth.l
  highpasswidth.l
  maskingadjust.f
  maskingadjust_short.f
  ATHonly.l
  ATHshort.l
  noATH.l
  ATHtype.l
  ATHcurve.f
  ATHlower.f
  athaa_type.l
  athaa_loudapprox.l
  athaa_sensitivity.f
  short_blocks.l
  useTemporal.l
  interChRatio.f
  msfix.f
  tune.l
  tune_value_a.f
  *msgf.l
 *debugf.l
 *errorf.l
EndStructure

Structure asm_optimizations
  mmx.l
  amd3dnow.l
  sse.l
EndStructure

#BE_CONFIG_MP3 = 0
#BE_CONFIG_LAME = 256
#BE_ERR_SUCCESSFUL = $00000000
#BE_ERR_INVALID_FORMAT = $00000001
#BE_ERR_INVALID_FORMAT_PARAMETERS = $00000002
#BE_ERR_NO_MORE_HANDLES = $00000003
#BE_ERR_INVALID_HANDLE = $00000004
#BE_ERR_BUFFER_TOO_SMALL = $00000005
#BE_MAX_HOMEPAGE = 128
#BE_MP3_MODE_STEREO = 0
#BE_MP3_MODE_JSTEREO = 1
#BE_MP3_MODE_DUALCHANNEL = 2
#BE_MP3_MODE_MONO = 3
#MPEG1 = 1
#MPEG2 = 0
#CURRENT_STRUCT_VERSION = 1

Enumeration   ; 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
EndEnumeration

Enumeration   ; 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
  #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
EndEnumeration

Structure LHV1
  dwConfig.l
  StructureUnion
    dwSampleRate.l
    byMode.b
    wBitrate.w
    bPrivate.l
    bCRC.l
    bCopyright.l
    bOriginal.l
  EndStructureUnion
  dwStructVersion.l
  dwStructSize.l
  SampleRate.l
  dwReSampleRate.l
  nMode.l
  dwBitrate.l
  dwMaxBitrate.l
  nPreset.l
  dwMpegVersion.l
  dwPsyModel.l
  dwEmphasis.l
  Private.l
  CRC.l
  Copyright.l
  Original.l
  bWriteVBRHeader.l
  bEnableVBR.l
  nVBRQuality.l
  dwVbrAbr_bps.l
  nVbrMethod.l
  bNoRes.l
  bStrictIso.l
  nQuality.w
EndStructure

Structure aac
  dwSampleRate.l
  byMode.b
  wBitrate.w
  byEncodingMethod.b
EndStructure

Structure BE_VERSION
  byDLLMajorVersion.b
  byDLLMinorVersion.b
  byMajorVersion.b
  byMinorVersion.b
  byDay.b
  byMonth.b
  wYear.w
  zHomepage.b[#BE_MAX_HOMEPAGE+1]
  byAlphaLevel.b
  byBetaLevel.b
  byMMXEnabled.b
  btReserved.b[125]
EndStructure

#TEXT_BEINITSTREAM = "beInitStream"
#TEXT_BEENCODECHUNK = "beEncodeChunk"
#TEXT_BEENCODECHUNKFLOATS16NI = "beEncodeChunkFloatS16NI"
#TEXT_BEDEINITSTREAM = "beDeinitStream"
#TEXT_BECLOSESTREAM = "beCloseStream"
#TEXT_BEVERSION = "beVersion"
#TEXT_BEWRITEVBRHEADER = "beWriteVBRHeader"
#TEXT_BEFLUSHNOGAP = "beFlushNoGap"
#TEXT_BEWRITEINFOTAG = "beWriteInfoTag"


Enumeration   ; vbr_mode
  #vbr_off = 0
  #vbr_mt
  #vbr_rh
  #vbr_abr
  #vbr_mtrh
  #vbr_max_indicator
  #vbr_default = #vbr_mtrh
EndEnumeration

Enumeration   ; MPEG_mode
  #STEREO = 0
  #JOINT_STEREO
  #DUAL_CHANNEL
  #MONO
  #NOT_SET
  #MAX_INDICATOR
EndEnumeration

Enumeration   ; Padding_type
  #PAD_NO = 0
  #PAD_ALL
  #PAD_ADJUST
  #PAD_MAX_INDICATOR
EndEnumeration

Enumeration   ; preset_mode
  #ABR_8 = 8
  #ABR_320 = 320
  #V9 = 410
  #VBR_10 = 410
  #V8 = 420
  #VBR_20 = 420
  #V7 = 430
  #VBR_30 = 430
  #V6 = 440
  #VBR_40 = 440
  #V5 = 450
  #VBR_50 = 450
  #V4 = 460
  #VBR_60 = 460
  #V3 = 470
  #VBR_70 = 470
  #V2 = 480
  #VBR_80 = 480
  #V1 = 490
  #VBR_90 = 490
  #V0 = 500
  #VBR_100 = 500
  #R3MIX = 1000
  #STANDARD = 1001
  #EXTREME = 1002
  #INSANE = 1003
  #STANDARD_FAST = 1004
  #EXTREME_FAST = 1005
  #MEDIUM = 1006
  #MEDIUM_FAST = 1007
EndEnumeration

Enumeration   ; asm_optimizations
  #MMX = 1
  #AMD_3DNOW = 2
  #SSE = 3
EndEnumeration

Enumeration   ; Psy_model
  #PSY_GPSYCHO = 1
  #PSY_NSPSYTUNE = 2
EndEnumeration

Structure lame_version_t
  major.l
  minor.l
  alpha.l
  beta.l
  psy_major.l
  psy_minor.l
  psy_alpha.l
  psy_beta.l
 *features.b
EndStructure

Structure mp3data_struct
  header_parsed.l
  stereo.l
  samplerate.l
  bitrate.l
  mode.l
  mode_ext.l
  framesize.l
  nsamp.l
  totalframes.l
  framenum.l
EndStructure

#LAME_MAXALBUMART = (128 * 1024)
#LAME_MAXMP3BUFFER = (16384 + #LAME_MAXALBUMART)
Enumeration   ; lame_errorcodes_t
  #LAME_OKAY = 0
  #LAME_NOERROR = 0
  #LAME_GENERICERROR = -1
  #LAME_NOMEM = -10
  #LAME_BADBITRATE = -11
  #LAME_BADSAMPFREQ = -12
  #LAME_INTERNALERROR = -13
  #FRONTEND_READERROR = -80
  #FRONTEND_WRITEERROR = -81
  #FRONTEND_FILETOOLARGE = -82
EndEnumeration

Global *gfp.lame_global_struct

PrototypeC lame_init()
PrototypeC lame_set_num_channels(*gfp, value)
PrototypeC lame_set_in_samplerate(*gfp, value)

; [...]
Define hDLL = OpenLibrary(#PB_Any, "lame_enc.dll")
If hDLL
  Global lame_init.lame_init = GetFunction(hDLL, "lame_init")
  Global lame_set_num_channels.lame_set_num_channels = GetFunction(hDLL, "lame_set_num_channels")
  Global lame_set_in_samplerate.lame_set_in_samplerate = GetFunction(hDLL, "lame_set_in_samplerate")
  ;[...]
EndIf

*gfp = lame_init()
lame_set_num_channels(*gfp, 2)
lame_set_in_samplerate(*gfp, 44100)

;[...]
Lade Dir den kompletten Source von Sourceforge.net und sehe die Header-Dateien sowie die
"API" Datei ohne Dateiextension an!

Gruß

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Wie lame_enc.dll nutzen ?

Beitrag von c4s »

Danke, dass bringt mich auf jeden Fall schonmal weiter. Ich werde aber erstmal versuchen mich an "How to use the DLL" (siehe http://lame.cvs.sourceforge.net/viewvc/ ... erface.htm) zu halten.
Meinen weiteren Fortschritt werde ich hier dokumentieren. ;)

Nebenbei: BOOL kann man also sorgenfrei als Long deklarieren?
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie lame_enc.dll nutzen ?

Beitrag von ts-soft »

c4s hat geschrieben:Nebenbei: BOOL kann man also sorgenfrei als Long deklarieren?
Ja, bzw. als Integer. Spielt bei der 32-Bit DLL aber keine Rolle (hab die eigentlichen
Integer alle als Long gelassen).
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
manunidi
Beiträge: 109
Registriert: 12.04.2006 22:44

Re: Wie lame_enc.dll nutzen ?

Beitrag von manunidi »

Wer nutzt die lame_enc.dll und wäre so lieb, uns den Quellcode hier zur Verfügung zu stellen?
Antworten