root/OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp @ 10961

Revision 10961, 2.7 kB (checked in by robert, 4 years ago)

From Serge Lages, "Here is a patch to allow setting an audio volume with the AudioSink? interface, I've also modified the ffmpeg plugin code to implement the ImageStream?'s setVolume method with its AudioSink?."

RevLine 
[9816]1
2#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H
3#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H
4
5#include <OpenThreads/Thread>
6
[10851]7#include <osg/Timer>
8
[9816]9#include "FFmpegClocks.hpp"
10#include "FFmpegPacket.hpp"
11
[9827]12#include <osg/AudioStream>
13
[9818]14#include "BoundedMessageQueue.hpp"
[9816]15
16
[9818]17
[9827]18
[9816]19namespace osgFFmpeg {
20
21
22
23class FFmpegDecoderAudio : public OpenThreads::Thread
24{
25public:
26
27    typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
28    typedef void (* PublishFunc) (const FFmpegDecoderAudio & decoder, void * user_data);
29
30    FFmpegDecoderAudio(PacketQueue & packets, FFmpegClocks & clocks);
31    ~FFmpegDecoderAudio();
32
33    void open(AVStream * stream);
[10851]34    void pause(bool pause);
[9869]35    void close(bool waitForThreadToExit);
36   
[10961]37    void setVolume(float volume);
38    float getVolume() const;
39
[9816]40    virtual void run();
41
[9847]42    void setAudioSink(osg::ref_ptr<osg::AudioSink> audio_sink);
[9816]43    void fillBuffer(void * buffer, size_t size);
44
45    bool validContext() const;
46    int frequency() const;
47    int nbChannels() const;
[9827]48    osg::AudioStream::SampleFormat sampleFormat() const;
[9816]49
50private:
51
[9847]52    typedef osg::ref_ptr<osg::AudioSink> SinkPtr;
[9816]53    typedef std::vector<uint8_t> Buffer;
54
55    void decodeLoop();
56    void adjustBufferEndTps(size_t buffer_size);
57    size_t decodeFrame(void * buffer, size_t size);
58
59
[10851]60    PacketQueue &                       m_packets;
61    FFmpegClocks &                      m_clocks;
62    AVStream *                          m_stream;
63    AVCodecContext *                    m_context;
64    FFmpegPacket                        m_packet;
65    const uint8_t *                     m_packet_data;
66    int                                 m_bytes_remaining;
[9816]67
[10851]68    Buffer                              m_audio_buffer;
69    size_t                              m_audio_buf_size;
70    size_t                              m_audio_buf_index;
[9816]71
[10851]72    int                                 m_frequency;
73    int                                 m_nb_channels;
74    osg::AudioStream::SampleFormat      m_sample_format;
[9816]75
[10851]76    SinkPtr                             m_audio_sink;
[9816]77
[10851]78    osg::Timer                          m_pause_timer;
79
80    bool                                m_end_of_stream;
81    bool                                m_paused;
82    volatile bool                       m_exit;
[9816]83};
84
85
86
87
88
89inline bool FFmpegDecoderAudio::validContext() const
90{
91    return m_context != 0;
92}
93
94
95inline int FFmpegDecoderAudio::frequency() const
96{
97    return m_frequency;
98}
99
100
101inline int FFmpegDecoderAudio::nbChannels() const
102{
103    return m_nb_channels;
104}
105
106
[9827]107inline osg::AudioStream::SampleFormat FFmpegDecoderAudio::sampleFormat() const
[9816]108{
109    return m_sample_format;
110}
111
112
113
114} // namespace osgFFmpeg
115
116
117
118#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_AUDIO_H
Note: See TracBrowser for help on using the browser.