1
//=========================================================
4
// $Id: audioprefetch.cpp,v 1.2 2002/02/27 11:52:58 muse Exp $
6
// (C) Copyright 2001 Werner Schweer (ws@seh.de)
7
//=========================================================
13
#include "audioprefetch.h"
18
//---------------------------------------------------------
20
//---------------------------------------------------------
22
AudioPrefetch::AudioPrefetch(bool rt=true, int prio=50, bool ml = true)
23
: Thread(rt, prio, ml)
28
//---------------------------------------------------------
30
//---------------------------------------------------------
32
static void readMsgP(void* p, void*)
34
AudioPrefetch* at = (AudioPrefetch*)p;
35
at->readMsg1(sizeof(PrefetchMsg));
38
//---------------------------------------------------------
40
//---------------------------------------------------------
42
void AudioPrefetch::start()
45
addPollFd(toThreadFdr, POLLIN, ::readMsgP, this, 0);
49
//---------------------------------------------------------
51
//---------------------------------------------------------
53
AudioPrefetch::~AudioPrefetch()
57
//---------------------------------------------------------
59
//---------------------------------------------------------
61
void AudioPrefetch::processMsg1(const void* m)
63
const PrefetchMsg* msg = (PrefetchMsg*)m;
66
prefetch(msg->pos, msg->bufferNo);
71
//---------------------------------------------------------
73
//---------------------------------------------------------
75
void AudioPrefetch::msgTick(int samplePos, int bufferNo)
80
msg.id = PREFETCH_TICK;
82
msg.bufferNo = bufferNo;
83
while (sendMsg1(&msg, sizeof(msg)))
87
//---------------------------------------------------------
89
//---------------------------------------------------------
91
void AudioPrefetch::prefetch(int pos, int bufferNo)
93
bool realloc = currentFrameSize != segmentSize;
94
TrackList* tl = song->tracks();
95
for (iTrack it = tl->begin(); it != tl->end(); ++it) {
96
if ((*it)->type() != Track::WAVE)
98
WaveTrack* track = (WaveTrack*)(*it);
99
track->fetchData(bufferNo, pos, realloc);
101
currentFrameSize = segmentSize;