Handle the source latency as an explicit nanosecond type
[alure.git] / examples / alure-stream.cpp
blob62d3e8aaa418dc0a0ae5bf942f9310258e644c68
1 /*
2 * A simple example showing how to stream a file through a source.
3 */
5 #include <iostream>
6 #include <sstream>
7 #include <iomanip>
8 #include <cstring>
9 #include <thread>
10 #include <chrono>
12 #include "alure2.h"
14 int main(int argc, char *argv[])
16 alure::DeviceManager &devMgr = alure::DeviceManager::get();
18 int fileidx = 1;
19 alure::Device dev;
20 if(argc > 3 && strcmp(argv[1], "-device") == 0)
22 fileidx = 3;
23 dev = devMgr.openPlayback(argv[2], std::nothrow);
24 if(!dev)
25 std::cerr<< "Failed to open \""<<argv[2]<<"\" - trying default" <<std::endl;
27 if(!dev)
28 dev = devMgr.openPlayback();
29 std::cout<< "Opened \""<<dev.getName()<<"\"" <<std::endl;
31 alure::Context ctx = dev.createContext();
32 alure::Context::MakeCurrent(ctx);
34 for(int i = fileidx;i < argc;i++)
36 float offset = 0.0f;
37 if(i+2 < argc && strcmp(argv[i], "-start") == 0)
39 std::stringstream sstr(argv[i+1]);
40 sstr >> offset;
42 i += 2;
45 alure::SharedPtr<alure::Decoder> decoder(ctx.createDecoder(argv[i]));
46 alure::Source source = ctx.createSource();
48 if(offset > 0.0f)
49 source.setOffset(uint64_t(offset * decoder->getFrequency()));
51 source.play(decoder, 12000, 4);
52 std::cout<< "Playing "<<argv[i]<<" ("<<alure::GetSampleTypeName(decoder->getSampleType())<<", "
53 <<alure::GetChannelConfigName(decoder->getChannelConfig())<<", "
54 <<decoder->getFrequency()<<"hz)" <<std::endl;
56 float invfreq = 1.0f / decoder->getFrequency();
57 while(source.isPlaying())
59 std::cout<< "\r "<<std::setiosflags(std::ios::fixed)<<std::setprecision(2)<<
60 (source.getOffset()*invfreq)<<" / "<<(decoder->getLength()*invfreq);
61 std::cout.flush();
62 std::this_thread::sleep_for(std::chrono::milliseconds(25));
63 ctx.update();
65 std::cout<<std::endl;
67 source.release();
70 alure::Context::MakeCurrent(nullptr);
71 ctx.destroy();
72 dev.close();
74 return 0;