2f8a0081c6
This should be a good first step to allow multi-driver targets, like the Elio (ATA/SD), or the D2 (NAND/SD). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18960 a1c6a512-1295-4272-9138-f99709370657
160 lines
5 KiB
C
160 lines
5 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id$
|
|
*
|
|
* AV stream manager decalarations
|
|
*
|
|
* Copyright (c) 2007 Michael Sevakis
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
#ifndef STREAM_MGR_H
|
|
#define STREAM_MGR_H
|
|
|
|
/* Basic media control interface - this handles state changes and stream
|
|
* coordination with assistance from the parser */
|
|
struct stream_mgr
|
|
{
|
|
struct thread_entry *thread; /* Playback control thread */
|
|
struct event_queue *q; /* event queue for control thread */
|
|
const char *filename; /* Current filename */
|
|
uint32_t resume_time; /* The stream tick where playback was
|
|
stopped (or started) */
|
|
bool seeked; /* A seek happened and things must be
|
|
resynced */
|
|
int status; /* Current playback status */
|
|
struct list_item strl; /* List of available streams */
|
|
struct list_item actl; /* List of active streams */
|
|
struct mutex str_mtx; /* Main stream manager mutex */
|
|
struct mutex actl_mtx; /* Lock for current-streams list */
|
|
union /* A place for reusable non-cacheable parameters */
|
|
{
|
|
struct vo_rect rc;
|
|
struct stream_seek_data skd;
|
|
} parms;
|
|
};
|
|
|
|
extern struct stream_mgr stream_mgr SHAREDBSS_ATTR;
|
|
|
|
struct stream_window
|
|
{
|
|
off_t left, right;
|
|
};
|
|
|
|
/** Interface for use by streams and other internal objects **/
|
|
bool stream_get_window(struct stream_window *sw);
|
|
void stream_clear_notify(struct stream *str, int for_msg);
|
|
int str_next_data_not_ready(struct stream *str);
|
|
/* Called by a stream to say it got its buffering notification */
|
|
void str_data_notify_received(struct stream *str);
|
|
void stream_add_stream(struct stream *str);
|
|
void stream_remove_streams(void);
|
|
|
|
enum stream_events
|
|
{
|
|
__STREAM_EV_FIRST = STREAM_MESSAGE_LAST-1,
|
|
STREAM_EV_COMPLETE,
|
|
};
|
|
|
|
void stream_generate_event(struct stream *str, long id, intptr_t data);
|
|
|
|
/** Main control functions **/
|
|
|
|
/* Initialize the playback engine */
|
|
int stream_init(void);
|
|
|
|
/* Close the playback engine */
|
|
void stream_exit(void);
|
|
|
|
/* Open a new file */
|
|
int stream_open(const char *filename);
|
|
|
|
/* Close the current file */
|
|
int stream_close(void);
|
|
|
|
/* Plays from the current seekpoint if stopped */
|
|
int stream_play(void);
|
|
|
|
/* Pauses playback if playing */
|
|
int stream_pause(void);
|
|
|
|
/* Resumes playback if paused */
|
|
int stream_resume(void);
|
|
|
|
/* Stops all streaming activity if playing or paused */
|
|
int stream_stop(void);
|
|
|
|
/* Point stream at a particular time.
|
|
* whence = one of SEEK_SET, SEEK_CUR, SEEK_END */
|
|
int stream_seek(uint32_t time, int whence);
|
|
|
|
/* Show/Hide the video image at the current seekpoint */
|
|
bool stream_show_vo(bool show);
|
|
|
|
/* Set the visible section of video */
|
|
void stream_vo_set_clip(const struct vo_rect *rc);
|
|
|
|
#ifndef HAVE_LCD_COLOR
|
|
void stream_gray_show(bool show);
|
|
#endif
|
|
|
|
/* Display thumbnail of the current seekpoint */
|
|
bool stream_display_thumb(const struct vo_rect *rc);
|
|
|
|
/* Draw the frame at the current position */
|
|
bool stream_draw_frame(bool no_prepare);
|
|
|
|
/* Return video dimensions */
|
|
bool stream_vo_get_size(struct vo_ext *sz);
|
|
|
|
/* Returns the resume time in timestamp ticks */
|
|
uint32_t stream_get_resume_time(void);
|
|
|
|
/* Returns stream_get_time if no seek is pending or else the
|
|
last time give to seek */
|
|
uint32_t stream_get_seek_time(uint32_t *start);
|
|
|
|
/* Return the absolute stream time in clock ticks - adjusted by
|
|
* master clock stream via audio timestamps */
|
|
static inline uint32_t stream_get_time(void)
|
|
{ return pcm_output_get_clock(); }
|
|
|
|
/* Return the absolute clock time in clock ticks - unadjusted */
|
|
static inline uint32_t stream_get_ticks(uint32_t *start)
|
|
{ return pcm_output_get_ticks(start); }
|
|
|
|
/* Returns the current playback status */
|
|
static inline int stream_status(void)
|
|
{ return stream_mgr.status; }
|
|
|
|
/* Wait for a state transistion to complete */
|
|
void stream_wait_status(void);
|
|
|
|
/* Returns the playback length of the stream */
|
|
static inline uint32_t stream_get_duration(void)
|
|
{ return str_parser.duration; }
|
|
|
|
static inline bool stream_can_seek(void)
|
|
{ return parser_can_seek(); }
|
|
|
|
/* Keep the disk spinning (for seeking and browsing) */
|
|
static inline void stream_keep_disk_active(void)
|
|
{
|
|
#ifdef HAVE_DISK_STORAGE
|
|
rb->storage_spin();
|
|
#endif
|
|
}
|
|
|
|
#endif /* STREAM_MGR_H */
|