1
1
//=========================================================
3
3
// Linux Music Editor
4
// $Id: audioprefetch.cpp,v 1.2 2002/02/27 11:52:58 muse Exp $
4
// $Id: audioprefetch.cpp,v 1.1.1.1 2003/10/29 10:05:00 wschweer Exp $
6
6
// (C) Copyright 2001 Werner Schweer (ws@seh.de)
7
7
//=========================================================
14
14
#include "globals.h"
19
AudioPrefetch* audioPrefetch;
18
21
//---------------------------------------------------------
20
23
//---------------------------------------------------------
22
AudioPrefetch::AudioPrefetch(bool rt=true, int prio=50, bool ml = true)
23
: Thread(rt, prio, ml)
25
AudioPrefetch::AudioPrefetch(int prio, const char* name)
28
32
//---------------------------------------------------------
63
67
const PrefetchMsg* msg = (PrefetchMsg*)m;
65
69
case PREFETCH_TICK:
66
prefetch(msg->pos, msg->bufferNo);
75
int rv = write(fromThreadFdw, m, 4);
77
perror("Thread::readMessage(): write pipe failed");
81
printf("AudioPrefetch::processMsg1: unknown message\n");
73
87
//---------------------------------------------------------
75
void AudioPrefetch::msgTick(int samplePos, int bufferNo)
80
msg.id = PREFETCH_TICK;
89
void AudioPrefetch::msgTick()
94
msg.id = PREFETCH_TICK;
95
while (sendMsg1(&msg, sizeof(msg))) {
96
printf("AudioPrefetch::msgTick::sleep(1)\n");
101
//---------------------------------------------------------
103
//---------------------------------------------------------
105
void AudioPrefetch::msgSeek(int samplePos)
110
msg.id = PREFETCH_SEEK;
81
111
msg.pos = samplePos;
82
msg.bufferNo = bufferNo;
83
112
while (sendMsg1(&msg, sizeof(msg)))
115
int rv = read(fromThreadFdr, &msg, 4);
117
perror("AudioPrefetch:: read pipe failed");
87
121
//---------------------------------------------------------
89
123
//---------------------------------------------------------
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;
125
void AudioPrefetch::prefetch()
130
TrackList* tl = song->tracks();
131
for (iTrack it = tl->begin(); it != tl->end(); ++it) {
132
if ((*it)->type() != Track::WAVE)
134
WaveTrack* track = (WaveTrack*)(*it);
135
// printf("prefetch %d\n", readSamplePos);
136
track->fetchData(readSamplePos, segmentSize);
138
readSamplePos += segmentSize;
141
//---------------------------------------------------------
143
//---------------------------------------------------------
145
void AudioPrefetch::seek(int pos)
150
TrackList* tl = song->tracks();
151
// printf("AudioPrefetch::seek(%d)\n", pos);
152
for (iTrack it = tl->begin(); it != tl->end(); ++it) {
153
if ((*it)->type() != Track::WAVE)
155
WaveTrack* track = (WaveTrack*)(*it);
156
track->clearPrefetchFifo();
157
for (int i = 0; i < FIFO_BUFFER; ++i) {
158
track->fetchData(readSamplePos + i * segmentSize, segmentSize);
162
readSamplePos += FIFO_BUFFER * segmentSize;