Avoid unnecessary templates
[alure.git] / examples / alure-stream.cpp
blobe8e5c4a9057620b0d1c3a89d32ca94743ea94fcf
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::getInstance();
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 alure::SharedPtr<alure::Decoder> decoder(ctx.createDecoder(argv[i]));
37 alure::Source source = ctx.createSource();
39 source.play(decoder, 12000, 4);
40 std::cout<< "Playing "<<argv[i]<<" ("<<alure::GetSampleTypeName(decoder->getSampleType())<<", "
41 <<alure::GetChannelConfigName(decoder->getChannelConfig())<<", "
42 <<decoder->getFrequency()<<"hz)" <<std::endl;
44 float invfreq = 1.0f / decoder->getFrequency();
45 while(source.isPlaying())
47 std::cout<< "\r "<<std::fixed<<std::setprecision(2)<<
48 source.getSecOffset().count()<<" / "<<(decoder->getLength()*invfreq);
49 std::cout.flush();
50 std::this_thread::sleep_for(std::chrono::milliseconds(25));
51 ctx.update();
53 std::cout<<std::endl;
55 source.release();
58 alure::Context::MakeCurrent(nullptr);
59 ctx.destroy();
60 dev.close();
62 return 0;