/[svn]/linuxsampler/trunk/src/stream.cpp
ViewVC logotype

Contents of /linuxsampler/trunk/src/stream.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18 - (show annotations) (download)
Sun Dec 7 05:03:43 2003 UTC (20 years, 4 months ago) by schoenebeck
File size: 4433 byte(s)
* src/audioio.cpp: added support for Alsa 1.0.0
* src/audiothread.cpp: fixed several bugs in sustain pedal handling
* src/diskthread.cpp: fixed several bugs which occured under extreme
  conditions (endless loop in audiothread, freezing the whole application,
  outage of available disk streams)
* src/voice.cpp: fixed cubic interpolation (disabled by default; you can
  enable it by setting USE_LINEAR_INTERPOLATION to 0 in src/voice.h)
* src/configure.in: added check for Alsa version

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003 by Benno Senoner *
6 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the Free Software *
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20 * MA 02111-1307 USA *
21 ***************************************************************************/
22
23 #include "stream.h"
24
25 // FIXME: already independent of audio channels, but assumes sample depth defined by 'sample_t' (usually 16 bit)
26
27
28 // *********** Stream **************
29 // *
30
31 uint Stream::UnusedStreams = 0;
32
33 /// Returns number of refilled sample points or a value < 0 on error.
34 int Stream::ReadAhead(unsigned long SampleCount) {
35 if (this->State == state_unused) return -1;
36 if (this->State == state_end) return 0;
37 if (!SampleCount) return 0;
38 if (!pRingBuffer->write_space()) return 0;
39
40 long total_readsamples = 0, readsamples = 0;
41 long samplestoread = SampleCount / pSample->Channels;
42
43 // refill the disk stream buffer
44 pSample->SetPos(this->SampleOffset);
45
46 sample_t* ptr = pRingBuffer->get_write_ptr();
47 do {
48 readsamples = pSample->Read(&ptr[total_readsamples * pSample->Channels], samplestoread);
49 samplestoread -= readsamples;
50 total_readsamples += readsamples;
51 } while (samplestoread && readsamples > 0);
52
53 // we must delay the increment_write_ptr_with_wrap() after the while() loop because we need to
54 // ensure that we read exactly SampleCount sample, otherwise the buffer wrapping code will fail
55 pRingBuffer->increment_write_ptr_with_wrap(total_readsamples * pSample->Channels);
56
57 // we have to store the position within the sample, because other streams might use the same sample
58 this->SampleOffset = pSample->GetPos();
59
60 bool endofsamplereached = (SampleOffset >= pSample->SamplesTotal);
61
62 // update stream state
63 if (endofsamplereached) SetState(state_end);
64 else SetState(state_active);
65
66 dmsg(5,("Refilled stream %d with %d (SamplePos: %d)", this->hThis, SampleCount - samplestoread, this->SampleOffset));
67 return (SampleCount - samplestoread);
68 }
69
70 void Stream::WriteSilence(unsigned long SilenceSampleWords) {
71 memset(pRingBuffer->get_write_ptr(), 0, SilenceSampleWords);
72 pRingBuffer->increment_write_ptr_with_wrap(SilenceSampleWords);
73 }
74
75 Stream::Stream(uint BufferSize, uint BufferWrapElements) {
76 this->pExportReference = NULL;
77 this->State = state_unused;
78 this->hThis = 0;
79 this->pSample = NULL;
80 this->SampleOffset = 0;
81 this->pRingBuffer = new RingBuffer<sample_t>(BufferSize, BufferWrapElements);
82 UnusedStreams++;
83 }
84
85 Stream::~Stream() {
86 Reset();
87 if (pRingBuffer) delete pRingBuffer;
88 }
89
90 /// Called by disk thread to activate the disk stream.
91 void Stream::Launch(Stream::Handle hStream, reference_t* pExportReference, gig::Sample* pSample, unsigned long SampleOffset) {
92 UnusedStreams--;
93 this->pExportReference = pExportReference;
94 this->hThis = hStream;
95 this->pSample = pSample;
96 this->SampleOffset = SampleOffset;
97 SetState(state_active);
98 }

  ViewVC Help
Powered by ViewVC