blob: fcffcf086ccd5b7f89635a141ee17fad14c3264a [file] [log] [blame]
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 Nicolas Pennequin
11 *
Daniel Stenberg2acc0ac2008-06-28 18:10:04 +000012 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000016 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#ifndef _BUFFERING_H_
23#define _BUFFERING_H_
24
25#include <sys/types.h>
26#include <stdbool.h>
Boris Gjenerofdc29d02011-12-19 20:12:52 +000027#include "config.h"
Jonathan Gordon71898e52008-10-16 10:38:03 +000028#include "appevents.h"
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000029
30
31enum data_type {
Michael Sevakisc537d592011-04-27 03:08:23 +000032 TYPE_UNKNOWN = 0, /* invalid type indicator */
33 TYPE_ID3,
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000034 TYPE_CODEC,
Brandon Lowdcca5862007-11-02 14:06:48 +000035 TYPE_PACKET_AUDIO,
36 TYPE_ATOMIC_AUDIO,
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000037 TYPE_CUESHEET,
Nicolas Pennequin9d4bed72007-11-11 12:29:37 +000038 TYPE_BITMAP,
Michael Sevakisc1a01be2017-12-08 13:01:25 -050039 TYPE_RAW_ATOMIC,
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000040};
41
Nicolas Pennequin78072792007-10-28 15:54:10 +000042/* Error return values */
Nicolas Pennequind400e232007-10-29 14:15:59 +000043#define ERR_HANDLE_NOT_FOUND -1
44#define ERR_BUFFER_FULL -2
45#define ERR_INVALID_VALUE -3
46#define ERR_FILE_ERROR -4
Brandon Low3386dd72007-11-28 04:58:16 +000047#define ERR_HANDLE_NOT_DONE -5
Thomas Martitz86cab2e2011-02-09 20:27:23 +000048#define ERR_UNSUPPORTED_TYPE -6
Michael Sevakis36615812013-08-26 16:49:53 -040049#define ERR_WRONG_THREAD -7
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000050
51/* Initialise the buffering subsystem */
Boris Gjenerofdc29d02011-12-19 20:12:52 +000052void buffering_init(void) INIT_ATTR;
Brandon Low14b6f432007-10-27 04:16:41 +000053
54/* Reset the buffering system */
Steve Bavin135cc752008-03-28 12:51:33 +000055bool buffering_reset(char *buf, size_t buflen);
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000056
57
58/***************************************************************************
59 * MAIN BUFFERING API CALLS
60 * ========================
61 *
62 * bufopen : Reserve space in the buffer for a given file
63 * bufalloc : Open a new handle from data that needs to be copied from memory
64 * bufclose : Close an open handle
65 * bufseek : Set handle reading index, relatively to the start of the file
66 * bufadvance: Move handle reading index, relatively to current position
Michael Sevakisc537d592011-04-27 03:08:23 +000067 * bufftell : Return the handle's file read position
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000068 * bufread : Copy data from a handle to a buffer
69 * bufgetdata: Obtain a pointer for linear access to a "size" amount of data
Brandon Low3386dd72007-11-28 04:58:16 +000070 * bufgettail: Out-of-band get the last size bytes of a handle.
71 * bufcuttail: Out-of-band remove the trailing 'size' bytes of a handle.
Nicolas Pennequinb838a622007-11-02 19:13:03 +000072 *
73 * NOTE: bufread and bufgetdata will block the caller until the requested
74 * amount of data is ready (unless EOF is reached).
Brandon Low3386dd72007-11-28 04:58:16 +000075 * NOTE: Tail operations are only legal when the end of the file is buffered.
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000076 ****************************************************************************/
77
Michael Sevakisdfff9382017-12-17 16:12:10 -050078int bufopen(const char *file, off_t offset, enum data_type type,
Thomas Martitze9c10182009-10-16 19:14:41 +000079 void *user_data);
Steve Bavin135cc752008-03-28 12:51:33 +000080int bufalloc(const void *src, size_t size, enum data_type type);
81bool bufclose(int handle_id);
82int bufseek(int handle_id, size_t newpos);
83int bufadvance(int handle_id, off_t offset);
Michael Sevakisc537d592011-04-27 03:08:23 +000084off_t bufftell(int handle_id);
Steve Bavin135cc752008-03-28 12:51:33 +000085ssize_t bufread(int handle_id, size_t size, void *dest);
86ssize_t bufgetdata(int handle_id, size_t size, void **data);
87ssize_t bufgettail(int handle_id, size_t size, void **data);
88ssize_t bufcuttail(int handle_id, size_t size);
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000089
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000090/***************************************************************************
91 * SECONDARY FUNCTIONS
92 * ===================
93 *
Michael Sevakisc537d592011-04-27 03:08:23 +000094 * buf_handle_data_type: return the handle's data type
95 * buf_is_handle: is the handle valid?
96 * buf_pin_handle: Disallow/allow handle movement. Handle may still be removed.
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000097 * buf_handle_offset: Get the offset of the first buffered byte from the file
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +000098 * buf_set_base_handle: Tell the buffering thread which handle is currently read
Michael Sevakisc537d592011-04-27 03:08:23 +000099 * buf_length: Total size of ringbuffer
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000100 * buf_used: Total amount of buffer space used (including allocated space)
Michael Sevakisc537d592011-04-27 03:08:23 +0000101 * buf_back_off_storage: tell buffering thread to take it easy
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000102 ****************************************************************************/
103
Michael Sevakisc537d592011-04-27 03:08:23 +0000104bool buf_is_handle(int handle_id);
Michael Sevakisdfff9382017-12-17 16:12:10 -0500105int buf_handle_data_type(int handle_id);
106off_t buf_filesize(int handle_id);
107off_t buf_handle_offset(int handle_id);
108off_t buf_handle_remaining(int handle_id);
Michael Sevakisc537d592011-04-27 03:08:23 +0000109bool buf_pin_handle(int handle_id, bool pin);
110bool buf_signal_handle(int handle_id, bool signal);
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000111
Michael Sevakisdfff9382017-12-17 16:12:10 -0500112size_t buf_length(void);
113size_t buf_used(void);
114
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000115/* Settings */
Michael Sevakisdfff9382017-12-17 16:12:10 -0500116void buf_set_base_handle(int handle_id);
Brandon Low33794402007-11-05 17:48:21 +0000117void buf_set_watermark(size_t bytes);
Michael Sevakisc537d592011-04-27 03:08:23 +0000118size_t buf_get_watermark(void);
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000119
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000120/* Debugging */
121struct buffering_debug {
122 int num_handles;
123 size_t buffered_data;
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000124 size_t data_rem;
125 size_t useful_data;
Thomas Martitzfcbfef82009-02-23 22:55:48 +0000126 size_t watermark;
Nicolas Pennequin3e3c43c2007-10-25 21:27:45 +0000127};
128void buffering_get_debugdata(struct buffering_debug *dbgdata);
129
130#endif