Help with FFI - another try
bert at impara.de
Wed Jul 19 14:34:21 UTC 2006
Given your application field, SoundBuffer should be fine.
- Bert -
Am 19.07.2006 um 13:40 schrieb Eugene Beschastnov:
> I'm not very good in C, but as I understand - yes, it is typedef for
> 'short*', but it's standard typedef.
> Anyway, what kind of data should I use to call FFI function that
> expects 'short*'?
> To be more specific, C function is
> __declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream,
> DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput);
> For this function I made this apicall construction:
> apiBeEncodeChunkHbeStream: hbeStream nSamples: nSamples pSamples:
> pSamples pOutput: pOutput pdwOutput: pdwOutput
> <apicall: ulong 'beEncodeChunk' ( ulong long short* byte* long* )
> module: 'lame_enc.dll'>
> ^self externalCallFailed
> And I'm trying to call it in following way:
> pMp3Buffer := ByteArray new: dwMp3Buffer.
> samples := (SampledSound fromWaveFileNamed: 'Message.wav')
> samples asWordArray.
> startOfChunk := 1.
> mp3Output := ByteArray new: 0.
> [startOfChunk <= samples size] whileTrue:
> [endOfChunk := startOfChunk + dwSamples - 1 min: samples size.
> buf := samples copyFrom: startOfChunk to: endOfChunk.
> startOfChunk := endOfChunk + 1.
> pDwWrite := WordArray new: 1.
> errCode := self
> apiBeEncodeChunkHbeStream: hbeStream
> nSamples: buf size
> pSamples: buf
> pOutput: pMp3Buffer
> pdwOutput: pDwWrite.
> errCode ~= self beErrSuccessful
> [self apiBeCloseStreamHbeStream: hbeStream.
> Exception signal: 'beEncodeChunk() failed (' , errCode
> asString , ')'].
> mp3Output addAll: (pMp3Buffer copyFrom: 1 to: pDwWrite first)].
> (FileStream fileNamed: 'Message.mp3') binary
> next: mp3Output size
> putAll: mp3Output
> startingAt: 1
> hbeStream, dwSamples and dwMp3Buffer are got from FFI function
> 'beInitStream', which is called earlier and executed correctly.
> 2006/7/19, Bert Freudenberg <bert at impara.de>:
>> Am 19.07.2006 um 12:33 schrieb Eugene Beschastnov:
>> > Another question - what construction in Squeak corresponds to
>> > PSHORT in C?
>> There is no type PSHORT in C. It probably is a typedef (could be a
>> macro too) which you need to lookup in the headers.
>> I'd guess it's a 'short*'.
>> - Bert -
More information about the Squeak-dev