Namespace: Un4seen.Bass
Assembly: Bass.Net (in Bass.Net.dll) Version: 2.4.17.5
[DllImportAttribute("bass")] public static long BASS_StreamGetFilePosition( int handle, BASSStreamFilePosition mode )
Parameters
- handle
- Type: SystemInt32
The stream's handle. - mode
- Type: Un4seen.BassBASSStreamFilePosition
The file position to retrieve. One of the following (BASSStreamFilePosition):Other modes may be supported by add-ons, see the documentation.BASS_FILEPOS_ASYNCBUF The amount of data in the asynchronous file reading buffer. This requires that the BASS_ASYNCFILE flag was used at the stream's creation. BASS_FILEPOS_AVAILABLE The amount of data currently available to read from the current position. BASS_FILEPOS_BUFFER The amount of data in the buffer of an internet file stream or "buffered" user file stream. Unless streaming in blocks, this is the same as BASS_FILEPOS_DOWNLOAD. BASS_FILEPOS_BUFFERING The percentage of buffering remaining before playback of an internet file stream or 'buffered' user file stream can resume. BASS_FILEPOS_CONNECTED Internet file stream or "buffered" user file stream is still connected? 0 = no, 1 = yes. BASS_FILEPOS_CURRENT Position that is to be decoded for playback next. This will be a bit ahead of the position actually being heard due to buffering. BASS_FILEPOS_DOWNLOAD Download progress of an internet file stream or "buffered" user file stream. BASS_FILEPOS_END End of the file, in other words the file length. When streaming in blocks, the file length is unknown, so the download buffer length is returned instead. BASS_FILEPOS_SIZE Total size of the file. BASS_FILEPOS_START Start of stream data in the file.
Return Value
Type: Int64If succesful, then the requested file position is returned, else -1 is returned. Use BASS_ErrorGetCode to get the error code.
ID3 tags (both v1 and v2) and WAVE headers, as well as any other rubbish at the start of the file, are excluded from the BASS_FILEPOS_CURRENT, BASS_FILEPOS_DOWNLOAD, and BASS_FILEPOS_END positions. The BASS_FILEPOS_START position can be added to get the actual file position.
When streaming a file from the internet or a 'buffered' user file stream, the entire file is downloaded even if the audio data ends before that, in case there are tags to be read. This means that the BASS_FILEPOS_DOWNLOAD position may go beyond the BASS_FILEPOS_END position.
It's unwise to use this function (with mode = BASS_FILEPOS_CURRENT) for syncing purposes because it returns the position that's being decoded, not the position that's being heard. Use BASS_ChannelGetPosition(Int32, BASSMode) for syncing instead.
Platform-specific: When an Android media codec (except AAC/ADTS) is used by a stream, only the BASS_FILEPOS_SIZE mode is supported, as the file reading will not be handled by BASS.
ERROR CODE | Description |
---|---|
BASS_ERROR_HANDLE | handle is not valid. |
BASS_ERROR_NOTFILE | The stream is not a file stream. |
BASS_ERROR_NOTAVAIL | The requested file position/status is not available. |
float progress; // file length int len = Bass.BASS_StreamGetFilePosition(stream, BASSStreamFilePosition.BASS_FILEPOS_END); // download progress int down = Bass.BASS_StreamGetFilePosition(stream, BASSStreamFilePosition.BASS_FILEPOS_DOWNLOAD); // get channel info BASS_CHANNELINFO info = Bass.BASS_ChannelGetInfo(stream); // streaming in blocks? if (info.flags & BASSFlag.BASS_STREAM_BLOCK != BASSFlag.BASS_DEFAULT) { // decode position int dec = BASS_StreamGetFilePosition(stream, BASSStreamFilePosition.BASS_FILEPOS_CURRENT); // percentage of buffer used progress = (down-dec)*100f / len; if (progress > 100) progress = 100; // restrict to 100 (can be higher) } else { // percentage of file downloaded progress = down*100f / len; }
// playback duration double time = Bass.BASS_ChannelBytes2Seconds(stream, Bass.BASS_ChannelGetLength(stream)); // file length long len = Bass.BASS_StreamGetFilePosition(stream, BASSStreamFilePosition.BASS_FILEPOS_END); // bitrate (kbps) int bitrate = (int)(len/(125*time)+0.5d);