Sets up an encoder on a channel, using an ACM codec and sending the output to a user defined function.
HENCODE BASS_Encode_StartACM( DWORD handle, void *form, DWORD flags, ENCODEPROC *proc, void *user );
|The channel handle... a HSTREAM, HMUSIC, or HRECORD.
|ACM codec output format.
|A combination of these flags.
|Callback function to receive the encoded data.
|User instance data to pass to the callback function.
Return valueThe encoder handle is returned if the encoder is successfully started, else 0 is returned. Use BASS_ErrorGetCode to get the error code.
|handle is not valid.
|The codec specified in form couldn't be initialized.
|Some other mystery problem!
RemarksThis function allows installed ACM (Audio Compression Manager) codecs to be used for encoding. The codec used is determined by the contents of the form parameter. The BASS_Encode_GetACMFormat function can be used to initialize that. ACM does not support floating-point data, so floating-point data will be converted to 16-bit before it is fed to the codec.
Internally, the sending of sample data to the encoder is implemented via a DSP callback on the channel. That means when you play the channel (or call BASS_ChannelGetData if it's a decoding channel), the sample data will be sent to the encoder at the same time. The encoding is performed in the DSP callback; there isn't a separate process doing the encoding, as when using an external encoder via BASS_Encode_Start.
By default, the encoder DSP has a priority setting of -1000, which determines where in the DSP chain the encoding is performed. That can be changed via the BASS_CONFIG_ENCODE_PRIORITY config option.
Besides the automatic DSP system, data can also be manually fed to the encoder via the BASS_Encode_Write function. Both methods can be used together, but in general, the "automatic" system ought to be paused when using the "manual" system, via the BASS_ENCODE_PAUSE flag or the BASS_Encode_SetPaused function. Data fed to the encoder manually does not go through the source channel's DSP chain, so any DSP/FX set on the channel will not be applied to the data.
When queued encoding is enabled via the BASS_ENCODE_QUEUE flag, the DSP system or BASS_Encode_Write call will just buffer the data, and the data will then be fed to the encoder by another thread. The buffer will grow as needed to hold the queued data, up to a limit specified by the BASS_CONFIG_ENCODE_QUEUE config option. If the limit is exceeded (or there is no free memory), data will be lost; BASS_Encode_SetNotify can be used to be notified of that occurrence. The amount of data that is currently queued, as well as the queue limit and how much data has been lost, is available from BASS_Encode_GetCount.
When done encoding, use BASS_Encode_Stop to close the encoder.
Multiple encoders can be set on a channel. For convenience, most of the encoder functions will accept either an encoder handle or a channel handle. When a channel handle is used, the function is applied to all encoders that are set on that channel.
BASS_Encode_StartACMFile can be used to have the encoder output sent to a file instead of a callback function.