A non-async stream is dead, don't try refilling it
[alure.git] / examples / alure-stream.cpp
blob4a931d0078b0fa9286f6af14cf9f3623d0fa62bb
1 #ifdef _WIN32
2 #define WIN32_LEAN_AND_MEAN
3 #include <windows.h>
4 #else
5 #include <errno.h>
6 #include <time.h>
7 #include <stdint.h>
8 inline void Sleep(uint32_t ms)
10 struct timespec ts, rem;
11 ts.tv_sec = ms / 1000;
12 ts.tv_nsec = (ms % 1000) * 1000000;
13 while(nanosleep(&ts, &rem) == -1 && errno == EINTR)
14 ts = rem;
16 #endif
18 #include <iostream>
19 #include <sstream>
20 #include <iomanip>
21 #include <cstring>
23 #include "alure2.h"
25 int main(int argc, char *argv[])
27 alure::DeviceManager *devMgr = alure::DeviceManager::get();
29 alure::Device *dev = devMgr->openPlayback();
30 std::cout<< "Opened \""<<dev->getName(alure::PlaybackDevType_Basic)<<"\"" <<std::endl;
32 alure::Context *ctx = dev->createContext();
33 alure::Context::MakeCurrent(ctx);
35 for(int i = 1;i < argc;i++)
37 float offset = 0.0f;
38 if(i+2 < argc && strcmp(argv[i], "-start") == 0)
40 std::stringstream sstr(argv[i+1]);
41 sstr >> offset;
43 i += 2;
46 alure::SharedPtr<alure::Decoder> decoder(ctx->createDecoder(argv[i]));
47 alure::Source *source = ctx->getSource();
49 if(offset > 0.0f)
50 source->setOffset(uint64_t(offset * decoder->getFrequency()));
52 source->play(decoder, 32768, 4);
53 std::cout<< "Playing "<<argv[i]<<" ("<<alure::GetSampleTypeName(decoder->getSampleType())<<", "
54 <<alure::GetChannelConfigName(decoder->getChannelConfig())<<", "
55 <<decoder->getFrequency()<<"hz)" <<std::endl;
57 float invfreq = 1.0f / decoder->getFrequency();
58 while(source->isPlaying())
60 std::cout<< "\r "<<std::setiosflags(std::ios::fixed)<<std::setprecision(2)<<
61 (source->getOffset()*invfreq)<<" / "<<(decoder->getLength()*invfreq);
62 std::cout.flush();
63 Sleep(25);
64 ctx->update();
66 std::cout<<std::endl;
68 source->release();
69 source = 0;
72 alure::Context::MakeCurrent(0);
73 ctx->destroy();
74 ctx = 0;
75 dev->close();
76 dev = 0;
78 return 0;