348d56f91a38c9b6546320f429dd3a091071502d
[camargo/neiasound.git] / src / stb_vorbis / nvorbisstream.cpp
1 // Copyright (C) 2015 Lucas Pires Camargo
2 // 
3 // This file is part of neiasound - Qt-style OpenAL wrapper for games.
4 // 
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 // 
9 // 1. Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // 
12 // 2. Redistributions in binary form must reproduce the above copyright notice,
13 // this list of conditions and the following disclaimer in the documentation
14 // and/or other materials provided with the distribution.
15 // 
16 // THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS
17 // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19 // NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
20 // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 // Copyright (C) 2015 Lucas Pires Camargo
27 // 
28 // This file is part of neiasound - Qt-style OpenAL wrapper for games.
29 // 
30 // Redistribution and use in source and binary forms, with or without
31 // modification, are permitted provided that the following conditions are
32 // met:
33 // 
34 // 1. Redistributions of source code must retain the above copyright notice,
35 // this list of conditions and the following disclaimer.
36 // 
37 // 2. Redistributions in binary form must reproduce the above copyright notice,
38 // this list of conditions and the following disclaimer in the documentation
39 // and/or other materials provided with the distribution.
40 // 
41 // THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS
42 // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
44 // NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
45 // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
46 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
48 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
50 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 #include "nvorbisstream.h"
52
53 #include <QIODevice>
54 #include "../nSoundBag.h"
55
56
57 #define STB_VORBIS_MAX_CHANNELS     2
58 #include "stb_vorbis.c"
59
60
61 nVorbisStream::nVorbisStream(QIODevice * dev, QObject *parent) : nSoundStream(parent),
62     _device(dev),
63     m_error(false),
64     _totalFrames(0),
65     _channels(0),
66     _frequency(0),
67     _format(SF_16BIT_STEREO)
68 {
69     _vorbis = 0;
70
71     if(!dev->isOpen())
72         dev->open(QIODevice::ReadOnly);
73
74     _qtBuf = dev->readAll();
75
76     dev->close();
77
78     if(_qtBuf.size())
79     {
80         _bufSize = _qtBuf.size();
81         _buf = _qtBuf.data();
82
83
84         int err = VORBIS__no_error;
85         _vorbis = stb_vorbis_open_memory((unsigned char*)_buf, _bufSize, &err,  0 );
86         if(!_vorbis || err != VORBIS__no_error)
87         {
88             qDebug(QStringLiteral("[nVorbisStream] Error initializing vorbis stream: %1").arg(err).toLocal8Bit());
89         }
90
91         stb_vorbis_info info = stb_vorbis_get_info(_vorbis);
92
93         _totalFrames = stb_vorbis_stream_length_in_samples(_vorbis);
94         _channels = _vorbis->channels;
95         _frequency = _vorbis->sample_rate;
96
97         switch (channels()) {
98         case 1:
99             _format = SF_16BIT_MONO;
100             break;
101         case 2:
102             _format = SF_16BIT_STEREO;
103             break;
104         default:
105             _format = SF_UNDEFINED;
106             break;
107         }
108     }
109     else
110     {
111         qDebug("[nVorbisStream] Error reading QIODevice");
112     }
113
114 }
115
116 nVorbisStream::~nVorbisStream()
117 {
118     stb_vorbis_close(_vorbis);
119     _qtBuf.clear();
120 }
121
122 void nVorbisStream::rewind()
123 {
124     if(_vorbis) stb_vorbis_seek_start(_vorbis);
125 }
126
127 quint64 nVorbisStream::read(void *data, unsigned long frames)
128 {
129     if(!frames) return 0;
130     return stb_vorbis_get_samples_short_interleaved(_vorbis, _channels, (short*) data, frames * _channels );
131
132 }
133