gosu 0.7.33 → 0.7.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gosu/Async.hpp +10 -8
- data/Gosu/Audio.hpp +6 -4
- data/Gosu/AutoLink.hpp +0 -0
- data/Gosu/Bitmap.hpp +4 -5
- data/Gosu/ButtonsX.hpp +1 -1
- data/Gosu/Color.hpp +8 -8
- data/Gosu/Font.hpp +2 -2
- data/Gosu/Graphics.hpp +4 -6
- data/Gosu/IO.hpp +11 -4
- data/Gosu/Image.hpp +9 -7
- data/Gosu/ImageData.hpp +10 -4
- data/Gosu/Input.hpp +4 -5
- data/Gosu/Sockets.hpp +10 -12
- data/Gosu/TR1.hpp +44 -0
- data/Gosu/TextInput.hpp +2 -2
- data/Gosu/Version.hpp +2 -2
- data/Gosu/WinUtility.hpp +5 -6
- data/Gosu/Window.hpp +5 -6
- data/GosuImpl/Async.cpp +4 -3
- data/GosuImpl/Audio/ALChannelManagement.hpp +23 -11
- data/GosuImpl/Audio/AudioFile.hpp +11 -3
- data/GosuImpl/Audio/AudioOpenAL.cpp +613 -0
- data/GosuImpl/Audio/AudioOpenAL.mm +1 -605
- data/GosuImpl/Audio/AudioSDL.cpp +12 -14
- data/GosuImpl/Audio/AudioToolboxFile.hpp +0 -1
- data/GosuImpl/Audio/OggFile.hpp +2 -0
- data/GosuImpl/Audio/SndFile.hpp +158 -0
- data/GosuImpl/DirectoriesWin.cpp +18 -18
- data/GosuImpl/Graphics/BitmapApple.mm +17 -19
- data/GosuImpl/Graphics/BitmapBMP.cpp +7 -2
- data/GosuImpl/Graphics/BitmapFreeImage.cpp +11 -12
- data/GosuImpl/Graphics/BitmapGDIplus.cpp +35 -31
- data/GosuImpl/Graphics/BitmapUtils.cpp +1 -1
- data/GosuImpl/Graphics/BlockAllocator.cpp +7 -8
- data/GosuImpl/Graphics/BlockAllocator.hpp +3 -4
- data/GosuImpl/Graphics/Common.hpp +3 -2
- data/GosuImpl/Graphics/DrawOp.hpp +2 -3
- data/GosuImpl/Graphics/DrawOpQueue.hpp +28 -20
- data/GosuImpl/Graphics/Font.cpp +13 -13
- data/GosuImpl/Graphics/FormattedString.hpp +93 -86
- data/GosuImpl/Graphics/Graphics.cpp +16 -14
- data/GosuImpl/Graphics/Image.cpp +7 -3
- data/GosuImpl/Graphics/LargeImageData.hpp +4 -5
- data/GosuImpl/Graphics/Macro.hpp +11 -11
- data/GosuImpl/Graphics/RenderState.hpp +5 -4
- data/GosuImpl/Graphics/TexChunk.cpp +3 -3
- data/GosuImpl/Graphics/TexChunk.hpp +4 -4
- data/GosuImpl/Graphics/Text.cpp +29 -30
- data/GosuImpl/Graphics/TextMac.cpp +9 -7
- data/GosuImpl/Graphics/TextTTFWin.cpp +3 -1
- data/GosuImpl/Graphics/TextTouch.mm +0 -1
- data/GosuImpl/Graphics/TextUnix.cpp +12 -4
- data/GosuImpl/Graphics/TextWin.cpp +4 -2
- data/GosuImpl/Graphics/Texture.cpp +7 -6
- data/GosuImpl/Graphics/Texture.hpp +3 -4
- data/GosuImpl/InputMac.mm +12 -15
- data/GosuImpl/InputTouch.mm +3 -3
- data/GosuImpl/InputWin.cpp +149 -159
- data/GosuImpl/InputX.cpp +0 -0
- data/GosuImpl/MacUtility.hpp +9 -4
- data/GosuImpl/RubyGosu.swg +38 -43
- data/GosuImpl/RubyGosu_wrap.cxx +89 -96
- data/GosuImpl/Sockets/CommSocket.cpp +5 -5
- data/GosuImpl/Sockets/Sockets.hpp +4 -4
- data/GosuImpl/TimingApple.cpp +2 -3
- data/GosuImpl/Utility.cpp +18 -0
- data/GosuImpl/WinMain.cpp +0 -1
- data/GosuImpl/WinUtility.cpp +2 -2
- data/GosuImpl/WindowMac.mm +20 -17
- data/GosuImpl/WindowTouch.mm +8 -7
- data/GosuImpl/WindowWin.cpp +12 -7
- data/GosuImpl/WindowX.cpp +67 -18
- data/lib/gosu.rb +14 -12
- data/linux/extconf.rb +11 -6
- metadata +8 -7
- data/GosuImpl/Audio/AudioAudiere.cpp +0 -448
- data/GosuImpl/RubyGosu_DllMain.cxx +0 -31
    
        data/lib/gosu.rb
    CHANGED
    
    | @@ -1,16 +1,18 @@ | |
| 1 1 | 
             
            require 'rbconfig'
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
              require " | 
| 11 | 
            -
             | 
| 12 | 
            -
              require " | 
| 13 | 
            -
             | 
| 3 | 
            +
            WINDOWS_HINTS = %w(-win32 win32- mswin mingw32)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            if defined? RUBY_PLATFORM and WINDOWS_HINTS.any? { |hint| RUBY_PLATFORM.include? hint } then
         | 
| 6 | 
            +
              ENV['PATH'] = "#{File.dirname(__FILE__)};#{ENV['PATH']}"
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            if File.exist? "#{File.dirname(__FILE__)}/gosu.#{Config::CONFIG['DLEXT']}"
         | 
| 10 | 
            +
              require "gosu.#{Config::CONFIG['DLEXT']}"
         | 
| 11 | 
            +
            elsif defined? RUBY_VERSION and RUBY_VERSION.split('.')[1].to_i > 8 then
         | 
| 12 | 
            +
              require "gosu.for_1_9.#{Config::CONFIG['DLEXT']}"
         | 
| 13 | 
            +
            else
         | 
| 14 | 
            +
              require "gosu.for_1_8.#{Config::CONFIG['DLEXT']}"
         | 
| 14 15 | 
             
            end
         | 
| 15 16 |  | 
| 16 | 
            -
            require " | 
| 17 | 
            +
            require "gosu/swig_patches"
         | 
| 18 | 
            +
            require "gosu/patches"
         | 
    
        data/linux/extconf.rb
    CHANGED
    
    | @@ -18,7 +18,6 @@ BASE_FILES = %w( | |
| 18 18 | 
             
              FileUnix.cpp
         | 
| 19 19 | 
             
              Graphics/Bitmap.cpp
         | 
| 20 20 | 
             
              Graphics/BitmapColorKey.cpp
         | 
| 21 | 
            -
              Graphics/BitmapFreeImage.cpp
         | 
| 22 21 | 
             
              Graphics/BitmapUtils.cpp
         | 
| 23 22 | 
             
              Graphics/BlockAllocator.cpp
         | 
| 24 23 | 
             
              Graphics/Color.cpp
         | 
| @@ -50,6 +49,7 @@ MAC_FILES = %w( | |
| 50 49 |  | 
| 51 50 | 
             
            LINUX_FILES = %w(
         | 
| 52 51 | 
             
              Audio/AudioSDL.cpp
         | 
| 52 | 
            +
              Graphics/BitmapFreeImage.cpp
         | 
| 53 53 | 
             
              Graphics/TextUnix.cpp
         | 
| 54 54 | 
             
              InputX.cpp
         | 
| 55 55 | 
             
              TextInputX.cpp
         | 
| @@ -64,12 +64,13 @@ $INCFLAGS << " -I../ -I../GosuImpl" | |
| 64 64 | 
             
            if `uname`.chomp == 'Darwin' then
         | 
| 65 65 | 
             
              SOURCE_FILES = BASE_FILES + MAC_FILES
         | 
| 66 66 |  | 
| 67 | 
            -
              #  | 
| 68 | 
            -
              $INCFLAGS << " -I/usr/ | 
| 69 | 
            -
               | 
| 70 | 
            -
              $ | 
| 67 | 
            +
              # Apple curiously distributes libpng only inside X11
         | 
| 68 | 
            +
              $INCFLAGS << " -I/usr/X11/include"
         | 
| 69 | 
            +
              # To make everything work with the Objective C runtime
         | 
| 70 | 
            +
              $CFLAGS   << " -x objective-c++ -fobjc-gc"
         | 
| 71 | 
            +
              $LDFLAGS  << " -L/usr/X11/lib -logg -lvorbis -lvorbisfile -liconv"
         | 
| 71 72 | 
             
              %w(AudioToolbox IOKit OpenAL OpenGL AppKit ApplicationServices Foundation Carbon).each do |f|
         | 
| 72 | 
            -
                 | 
| 73 | 
            +
                #$INCFLAGS << " -framework #{f}" <- not necessary? I only get lots of warnings
         | 
| 73 74 | 
             
                $LDFLAGS  << " -framework #{f}"
         | 
| 74 75 | 
             
              end
         | 
| 75 76 |  | 
| @@ -92,6 +93,10 @@ else | |
| 92 93 | 
             
              have_header('SDL_ttf.h') if have_library('SDL_ttf', 'TTF_RenderUTF8_Blended')
         | 
| 93 94 | 
             
              have_header('gl.h') if have_library('GL', 'glMatrixMode')
         | 
| 94 95 | 
             
              have_header('FreeImage.h') if have_library('freeimage', 'FreeImage_ConvertFromRawBits')
         | 
| 96 | 
            +
              have_header('vorbisfile.h') if have_library('vorbisfile', 'ov_open_callbacks')
         | 
| 97 | 
            +
              have_header('AL/al.h') if have_library('openal')
         | 
| 98 | 
            +
              have_header('sndfile.h') if have_library('sndfile')
         | 
| 99 | 
            +
              have_header('X11/extensions/Xdamage.h')
         | 
| 95 100 | 
             
            end
         | 
| 96 101 |  | 
| 97 102 | 
             
            # Copy all relevant C++ files into the current directory
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: gosu
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 69
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 8 | 
             
              - 7
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 0.7. | 
| 9 | 
            +
              - 35
         | 
| 10 | 
            +
              version: 0.7.35
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Julian Raschke
         | 
| @@ -16,7 +16,7 @@ autorequire: | |
| 16 16 | 
             
            bindir: bin
         | 
| 17 17 | 
             
            cert_chain: []
         | 
| 18 18 |  | 
| 19 | 
            -
            date: 2011- | 
| 19 | 
            +
            date: 2011-08-12 00:00:00 Z
         | 
| 20 20 | 
             
            dependencies: []
         | 
| 21 21 |  | 
| 22 22 | 
             
            description: "  2D game development library.\n\n  Gosu features easy to use and game-friendly interfaces to 2D graphics\n  and text (accelerated by 3D hardware), sound samples and music as well as\n  keyboard, mouse and gamepad/joystick input.\n\n  Also includes demos for integration with RMagick, Chipmunk and Ruby-OpenGL.\n"
         | 
| @@ -55,6 +55,7 @@ files: | |
| 55 55 | 
             
            - Gosu/Text.hpp
         | 
| 56 56 | 
             
            - Gosu/TextInput.hpp
         | 
| 57 57 | 
             
            - Gosu/Timing.hpp
         | 
| 58 | 
            +
            - Gosu/TR1.hpp
         | 
| 58 59 | 
             
            - Gosu/Utility.hpp
         | 
| 59 60 | 
             
            - Gosu/Version.hpp
         | 
| 60 61 | 
             
            - Gosu/Window.hpp
         | 
| @@ -86,12 +87,13 @@ files: | |
| 86 87 | 
             
            - examples/media/Starfighter.bmp
         | 
| 87 88 | 
             
            - GosuImpl/Async.cpp
         | 
| 88 89 | 
             
            - GosuImpl/Audio/ALChannelManagement.hpp
         | 
| 89 | 
            -
            - GosuImpl/Audio/AudioAudiere.cpp
         | 
| 90 90 | 
             
            - GosuImpl/Audio/AudioFile.hpp
         | 
| 91 | 
            +
            - GosuImpl/Audio/AudioOpenAL.cpp
         | 
| 91 92 | 
             
            - GosuImpl/Audio/AudioOpenAL.mm
         | 
| 92 93 | 
             
            - GosuImpl/Audio/AudioSDL.cpp
         | 
| 93 94 | 
             
            - GosuImpl/Audio/AudioToolboxFile.hpp
         | 
| 94 95 | 
             
            - GosuImpl/Audio/OggFile.hpp
         | 
| 96 | 
            +
            - GosuImpl/Audio/SndFile.hpp
         | 
| 95 97 | 
             
            - GosuImpl/DirectoriesMac.mm
         | 
| 96 98 | 
             
            - GosuImpl/DirectoriesTouch.mm
         | 
| 97 99 | 
             
            - GosuImpl/DirectoriesUnix.cpp
         | 
| @@ -146,7 +148,6 @@ files: | |
| 146 148 | 
             
            - GosuImpl/Orientation.hpp
         | 
| 147 149 | 
             
            - GosuImpl/Orientation.mm
         | 
| 148 150 | 
             
            - GosuImpl/RubyGosu.swg
         | 
| 149 | 
            -
            - GosuImpl/RubyGosu_DllMain.cxx
         | 
| 150 151 | 
             
            - GosuImpl/RubyGosu_SWIG_GC_PATCH.patch
         | 
| 151 152 | 
             
            - GosuImpl/RubyGosu_SWIG_RENAME_PATCH.patch
         | 
| 152 153 | 
             
            - GosuImpl/RubyGosu_SWIG_TYPE_PATCH.patch
         | 
| @@ -205,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 205 206 | 
             
            requirements: 
         | 
| 206 207 | 
             
            - See https://github.com/jlnr/gosu/wiki/Getting-Started-on-Linux
         | 
| 207 208 | 
             
            rubyforge_project: 
         | 
| 208 | 
            -
            rubygems_version: 1.8. | 
| 209 | 
            +
            rubygems_version: 1.8.7
         | 
| 209 210 | 
             
            signing_key: 
         | 
| 210 211 | 
             
            specification_version: 3
         | 
| 211 212 | 
             
            summary: 2D game development library.
         | 
| @@ -1,448 +0,0 @@ | |
| 1 | 
            -
            #include <Gosu/Audio.hpp>
         | 
| 2 | 
            -
            #include <Gosu/Math.hpp>
         | 
| 3 | 
            -
            #include <Gosu/IO.hpp>
         | 
| 4 | 
            -
            #include <Gosu/Utility.hpp>
         | 
| 5 | 
            -
            #include <boost/foreach.hpp>
         | 
| 6 | 
            -
            #include <algorithm>
         | 
| 7 | 
            -
            #include <stdexcept>
         | 
| 8 | 
            -
            #include <vector>
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            #include <audiere.h>
         | 
| 11 | 
            -
            using namespace audiere;
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            namespace Gosu
         | 
| 14 | 
            -
            {
         | 
| 15 | 
            -
                namespace
         | 
| 16 | 
            -
                {
         | 
| 17 | 
            -
                    Song* curSong = 0;
         | 
| 18 | 
            -
                    
         | 
| 19 | 
            -
                    // Gosu::Buffer-based implementation of Audiere's File interface.
         | 
| 20 | 
            -
                    // Provided since Audiere uses stdio to open files, which may not support Unicode
         | 
| 21 | 
            -
                    // filenames outside of the current codepage on Windows(?).
         | 
| 22 | 
            -
                    class MemoryBuffer : boost::noncopyable
         | 
| 23 | 
            -
                    {
         | 
| 24 | 
            -
                        Gosu::Buffer buffer;
         | 
| 25 | 
            -
                        FilePtr file;
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                    public:
         | 
| 28 | 
            -
                        MemoryBuffer(Gosu::Reader reader)
         | 
| 29 | 
            -
                        {
         | 
| 30 | 
            -
                            buffer.resize(reader.resource().size() - reader.position());
         | 
| 31 | 
            -
                            reader.read(buffer.data(), buffer.size());
         | 
| 32 | 
            -
                            file = audiere::CreateMemoryFile(buffer.data(), buffer.size());
         | 
| 33 | 
            -
                        }
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                        MemoryBuffer(const std::wstring& filename)
         | 
| 36 | 
            -
                        {
         | 
| 37 | 
            -
                            Gosu::loadFile(buffer, filename);
         | 
| 38 | 
            -
                            file = audiere::CreateMemoryFile(buffer.data(), buffer.size());
         | 
| 39 | 
            -
                        }
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                        operator const FilePtr&()
         | 
| 42 | 
            -
                        {
         | 
| 43 | 
            -
                            return file;
         | 
| 44 | 
            -
                        }
         | 
| 45 | 
            -
                    };
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                    class StreamRegistry : public RefImplementation<StopCallback>, boost::noncopyable
         | 
| 48 | 
            -
                    {
         | 
| 49 | 
            -
                        struct NumberedStream
         | 
| 50 | 
            -
                        {
         | 
| 51 | 
            -
                            int extra;
         | 
| 52 | 
            -
                            OutputStreamPtr stream;
         | 
| 53 | 
            -
                        };
         | 
| 54 | 
            -
                        std::vector<NumberedStream> streams;
         | 
| 55 | 
            -
                        
         | 
| 56 | 
            -
                        ADR_METHOD(void) streamStopped(StopEvent* event)
         | 
| 57 | 
            -
                        {
         | 
| 58 | 
            -
                            if (event->getReason() == StopEvent::STREAM_ENDED)
         | 
| 59 | 
            -
                                BOOST_FOREACH (NumberedStream& stream, streams)
         | 
| 60 | 
            -
                                    if (stream.stream == event->getOutputStream())
         | 
| 61 | 
            -
                                    {
         | 
| 62 | 
            -
                                        stream.stream = 0;
         | 
| 63 | 
            -
                                        break;
         | 
| 64 | 
            -
                                    }
         | 
| 65 | 
            -
                        }
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                    public:
         | 
| 68 | 
            -
                        StreamRegistry()
         | 
| 69 | 
            -
                        {
         | 
| 70 | 
            -
                            streams.reserve(100);
         | 
| 71 | 
            -
                        }
         | 
| 72 | 
            -
                        
         | 
| 73 | 
            -
                        OutputStreamPtr get(int handle, int extra) const
         | 
| 74 | 
            -
                        {
         | 
| 75 | 
            -
                            if (handle < streams.size() && streams[handle].extra == extra)
         | 
| 76 | 
            -
                                return streams[handle].stream;
         | 
| 77 | 
            -
                            return OutputStreamPtr();
         | 
| 78 | 
            -
                        }
         | 
| 79 | 
            -
                        
         | 
| 80 | 
            -
                        void put(OutputStreamPtr stream, int& handle, int& extra)
         | 
| 81 | 
            -
                        {
         | 
| 82 | 
            -
                            handle = 0;
         | 
| 83 | 
            -
                            for (handle; handle < streams.size(); ++handle)
         | 
| 84 | 
            -
                                if (!streams[handle].stream)
         | 
| 85 | 
            -
                                {
         | 
| 86 | 
            -
                                    streams[handle].stream = stream;
         | 
| 87 | 
            -
                                    extra = ++streams[handle].extra;
         | 
| 88 | 
            -
                                    return;
         | 
| 89 | 
            -
                                }
         | 
| 90 | 
            -
                            // handle == streams.size() <3  
         | 
| 91 | 
            -
                            NumberedStream newStream = { extra = 0, stream };
         | 
| 92 | 
            -
                            streams.push_back(newStream);
         | 
| 93 | 
            -
                        }
         | 
| 94 | 
            -
                        
         | 
| 95 | 
            -
                        void clear(int handle)
         | 
| 96 | 
            -
                        {
         | 
| 97 | 
            -
                            streams.at(handle).stream = 0;
         | 
| 98 | 
            -
                        }
         | 
| 99 | 
            -
                    };
         | 
| 100 | 
            -
                    
         | 
| 101 | 
            -
                    // Intentionally leak. Let Windows clean up on program exit.
         | 
| 102 | 
            -
                    StreamRegistry& streams = *(new StreamRegistry);
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                    // Since audiere::OpenDevice is (contains) the first call to audiere.dll, we wrap
         | 
| 105 | 
            -
                    // the call in error handling code to see if the lazily linked DLL is there.
         | 
| 106 | 
            -
                    bool getDevice(AudioDevice*& device)
         | 
| 107 | 
            -
                    {
         | 
| 108 | 
            -
                        #ifdef GOSU_IS_WIN
         | 
| 109 | 
            -
                        // Copied and pasted from MSDN.
         | 
| 110 | 
            -
                        #define FACILITY_VISUALCPP  ((LONG)0x6d)
         | 
| 111 | 
            -
                        #define VcppException(sev,err)  ((sev) | (FACILITY_VISUALCPP<<16) | err)
         | 
| 112 | 
            -
                        #define BAD_MOD VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND)
         | 
| 113 | 
            -
                        
         | 
| 114 | 
            -
                        __try
         | 
| 115 | 
            -
                        {
         | 
| 116 | 
            -
                        #endif
         | 
| 117 | 
            -
                            return (device = OpenDevice());
         | 
| 118 | 
            -
                        #ifdef GOSU_IS_WIN
         | 
| 119 | 
            -
                        }
         | 
| 120 | 
            -
                        __except ((GetExceptionCode() == BAD_MOD) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
         | 
| 121 | 
            -
                        {
         | 
| 122 | 
            -
                            return false;
         | 
| 123 | 
            -
                        }
         | 
| 124 | 
            -
                        #undef BAD_MOD
         | 
| 125 | 
            -
                        #undef VcppException
         | 
| 126 | 
            -
                        #undef FACILITY_VISUALCPP
         | 
| 127 | 
            -
                        #endif
         | 
| 128 | 
            -
                    }
         | 
| 129 | 
            -
             | 
| 130 | 
            -
                    AudioDevice* device()
         | 
| 131 | 
            -
                    {
         | 
| 132 | 
            -
                        static AudioDevice* device = 0;
         | 
| 133 | 
            -
                        if (device == 0)
         | 
| 134 | 
            -
                        {
         | 
| 135 | 
            -
                            if (!getDevice(device))
         | 
| 136 | 
            -
                                throw std::runtime_error("Could not initialize audiere or library not found");
         | 
| 137 | 
            -
             | 
| 138 | 
            -
                            device->registerCallback(&streams);
         | 
| 139 | 
            -
             | 
| 140 | 
            -
                            // Never free. Especially important in Ruby version, where GC order is undefined
         | 
| 141 | 
            -
                            device->ref();
         | 
| 142 | 
            -
                        }
         | 
| 143 | 
            -
                        return device;
         | 
| 144 | 
            -
                    }
         | 
| 145 | 
            -
                }
         | 
| 146 | 
            -
            }
         | 
| 147 | 
            -
             | 
| 148 | 
            -
            Gosu::SampleInstance::SampleInstance(int handle, int extra)
         | 
| 149 | 
            -
            : handle(handle), extra(extra)
         | 
| 150 | 
            -
            {
         | 
| 151 | 
            -
            }
         | 
| 152 | 
            -
             | 
| 153 | 
            -
            bool Gosu::SampleInstance::playing() const
         | 
| 154 | 
            -
            {
         | 
| 155 | 
            -
                OutputStreamPtr stream = streams.get(handle, extra);
         | 
| 156 | 
            -
                return stream && stream->isPlaying();
         | 
| 157 | 
            -
            }
         | 
| 158 | 
            -
             | 
| 159 | 
            -
            bool Gosu::SampleInstance::paused() const
         | 
| 160 | 
            -
            {
         | 
| 161 | 
            -
                OutputStreamPtr stream = streams.get(handle, extra);
         | 
| 162 | 
            -
                return stream && !stream->isPlaying();
         | 
| 163 | 
            -
            }
         | 
| 164 | 
            -
             | 
| 165 | 
            -
            void Gosu::SampleInstance::pause()
         | 
| 166 | 
            -
            {
         | 
| 167 | 
            -
                if (OutputStreamPtr stream = streams.get(handle, extra))
         | 
| 168 | 
            -
                    stream->stop();
         | 
| 169 | 
            -
            }
         | 
| 170 | 
            -
             | 
| 171 | 
            -
            void Gosu::SampleInstance::resume()
         | 
| 172 | 
            -
            {
         | 
| 173 | 
            -
                if (OutputStreamPtr stream = streams.get(handle, extra))
         | 
| 174 | 
            -
                    stream->play();
         | 
| 175 | 
            -
            }
         | 
| 176 | 
            -
             | 
| 177 | 
            -
            void Gosu::SampleInstance::stop()
         | 
| 178 | 
            -
            {
         | 
| 179 | 
            -
                if (OutputStreamPtr stream = streams.get(handle, extra))
         | 
| 180 | 
            -
                    stream->stop(), streams.clear(handle);
         | 
| 181 | 
            -
            }
         | 
| 182 | 
            -
             | 
| 183 | 
            -
            void Gosu::SampleInstance::changeVolume(double volume)
         | 
| 184 | 
            -
            {
         | 
| 185 | 
            -
                if (OutputStreamPtr stream = streams.get(handle, extra))
         | 
| 186 | 
            -
                    stream->setVolume(volume);
         | 
| 187 | 
            -
            }
         | 
| 188 | 
            -
             | 
| 189 | 
            -
            void Gosu::SampleInstance::changePan(double pan)
         | 
| 190 | 
            -
            {
         | 
| 191 | 
            -
                if (OutputStreamPtr stream = streams.get(handle, extra))
         | 
| 192 | 
            -
                    stream->setPan(clamp<float>(pan, -1.f, +1.f));
         | 
| 193 | 
            -
            }
         | 
| 194 | 
            -
             | 
| 195 | 
            -
            void Gosu::SampleInstance::changeSpeed(double speed)
         | 
| 196 | 
            -
            {
         | 
| 197 | 
            -
                if (OutputStreamPtr stream = streams.get(handle, extra))
         | 
| 198 | 
            -
                    stream->setPitchShift(clamp<float>(speed, 0.5f, 2.0f));
         | 
| 199 | 
            -
            }
         | 
| 200 | 
            -
             | 
| 201 | 
            -
            struct Gosu::Sample::SampleData : boost::noncopyable
         | 
| 202 | 
            -
            {
         | 
| 203 | 
            -
                SampleBufferPtr buffer;
         | 
| 204 | 
            -
            };
         | 
| 205 | 
            -
             | 
| 206 | 
            -
            Gosu::Sample::Sample(const std::wstring& filename)
         | 
| 207 | 
            -
            :   data(new SampleData)
         | 
| 208 | 
            -
            {
         | 
| 209 | 
            -
                device(); // Implicitly open audio device
         | 
| 210 | 
            -
                
         | 
| 211 | 
            -
                SampleSourcePtr source = OpenSampleSource(MemoryBuffer(filename), FF_AUTODETECT);
         | 
| 212 | 
            -
                data->buffer = CreateSampleBuffer(source);
         | 
| 213 | 
            -
                if (!data->buffer)
         | 
| 214 | 
            -
                    throw std::runtime_error("Cannot open " + wstringToUTF8(filename));
         | 
| 215 | 
            -
            }
         | 
| 216 | 
            -
             | 
| 217 | 
            -
            Gosu::Sample::Sample(Reader reader)
         | 
| 218 | 
            -
            {
         | 
| 219 | 
            -
                device(); // Implicitly open audio device
         | 
| 220 | 
            -
                
         | 
| 221 | 
            -
                SampleSourcePtr source = audiere::OpenSampleSource(MemoryBuffer(reader), FF_AUTODETECT);
         | 
| 222 | 
            -
                data->buffer = CreateSampleBuffer(source);
         | 
| 223 | 
            -
                if (!data->buffer)
         | 
| 224 | 
            -
                    throw std::runtime_error("Cannot open audio file");
         | 
| 225 | 
            -
            }
         | 
| 226 | 
            -
             | 
| 227 | 
            -
            Gosu::SampleInstance Gosu::Sample::play(double volume, double speed,
         | 
| 228 | 
            -
                bool looping) const
         | 
| 229 | 
            -
            {
         | 
| 230 | 
            -
                OutputStreamPtr stream = device()->openStream(data->buffer->openStream());
         | 
| 231 | 
            -
                int handle, extra;
         | 
| 232 | 
            -
                streams.put(stream, handle, extra);
         | 
| 233 | 
            -
             | 
| 234 | 
            -
                SampleInstance instance(handle, extra);
         | 
| 235 | 
            -
                instance.changeVolume(volume);
         | 
| 236 | 
            -
                instance.changeSpeed(speed);
         | 
| 237 | 
            -
                stream->setRepeat(looping);
         | 
| 238 | 
            -
                stream->play();
         | 
| 239 | 
            -
                return instance;
         | 
| 240 | 
            -
            }
         | 
| 241 | 
            -
             | 
| 242 | 
            -
            Gosu::SampleInstance Gosu::Sample::playPan(double pan, double volume,
         | 
| 243 | 
            -
                double speed, bool looping) const
         | 
| 244 | 
            -
            {
         | 
| 245 | 
            -
                OutputStreamPtr stream = device()->openStream(data->buffer->openStream());
         | 
| 246 | 
            -
                int handle, extra;
         | 
| 247 | 
            -
                streams.put(stream, handle, extra);
         | 
| 248 | 
            -
             | 
| 249 | 
            -
                SampleInstance instance(handle, extra);
         | 
| 250 | 
            -
                instance.changePan(pan);
         | 
| 251 | 
            -
                instance.changeVolume(volume);
         | 
| 252 | 
            -
                instance.changeSpeed(speed);
         | 
| 253 | 
            -
                stream->setRepeat(looping);
         | 
| 254 | 
            -
                stream->play();
         | 
| 255 | 
            -
                return instance;
         | 
| 256 | 
            -
            }
         | 
| 257 | 
            -
             | 
| 258 | 
            -
            class Gosu::Song::BaseData : boost::noncopyable
         | 
| 259 | 
            -
            {
         | 
| 260 | 
            -
                double volume_;
         | 
| 261 | 
            -
             | 
| 262 | 
            -
            protected:
         | 
| 263 | 
            -
                BaseData() : volume_(1) {}
         | 
| 264 | 
            -
                virtual void applyVolume() = 0;
         | 
| 265 | 
            -
             | 
| 266 | 
            -
            public:
         | 
| 267 | 
            -
                virtual ~BaseData() {}
         | 
| 268 | 
            -
             | 
| 269 | 
            -
                virtual void play(bool looping) = 0;
         | 
| 270 | 
            -
                virtual bool playing() const = 0;
         | 
| 271 | 
            -
                virtual bool paused() const = 0;
         | 
| 272 | 
            -
                virtual void pause() = 0;
         | 
| 273 | 
            -
                virtual void stop() = 0;
         | 
| 274 | 
            -
                
         | 
| 275 | 
            -
                double volume() const
         | 
| 276 | 
            -
                {
         | 
| 277 | 
            -
                    return volume_;
         | 
| 278 | 
            -
                }
         | 
| 279 | 
            -
                
         | 
| 280 | 
            -
                void changeVolume(double volume)
         | 
| 281 | 
            -
                {
         | 
| 282 | 
            -
                    volume_ = clamp(volume, 0.0, 1.0);
         | 
| 283 | 
            -
                    applyVolume();
         | 
| 284 | 
            -
                }
         | 
| 285 | 
            -
            };
         | 
| 286 | 
            -
             | 
| 287 | 
            -
            class Gosu::Song::StreamData : public BaseData
         | 
| 288 | 
            -
            {
         | 
| 289 | 
            -
                MemoryBuffer buffer;
         | 
| 290 | 
            -
                OutputStreamPtr stream;
         | 
| 291 | 
            -
                SampleInstance instance;
         | 
| 292 | 
            -
                bool loop;
         | 
| 293 | 
            -
             | 
| 294 | 
            -
                void init()
         | 
| 295 | 
            -
                {
         | 
| 296 | 
            -
                    int handle, extra;
         | 
| 297 | 
            -
                    stream = OpenSound(device(), buffer, true);
         | 
| 298 | 
            -
                    if (!stream)
         | 
| 299 | 
            -
                        throw std::runtime_error("Cannot open audio file for streaming");
         | 
| 300 | 
            -
                    streams.put(stream, handle, extra);
         | 
| 301 | 
            -
                    instance = SampleInstance(handle, extra);
         | 
| 302 | 
            -
                    loop = false;
         | 
| 303 | 
            -
                }
         | 
| 304 | 
            -
             | 
| 305 | 
            -
            public:
         | 
| 306 | 
            -
                StreamData(Gosu::Reader reader)
         | 
| 307 | 
            -
                :   buffer(reader), instance(-1, -1)
         | 
| 308 | 
            -
                {
         | 
| 309 | 
            -
                    init();
         | 
| 310 | 
            -
                }
         | 
| 311 | 
            -
             | 
| 312 | 
            -
                StreamData(const std::wstring& filename)
         | 
| 313 | 
            -
                :   buffer(filename), instance(-1, -1)
         | 
| 314 | 
            -
                {
         | 
| 315 | 
            -
                    init();
         | 
| 316 | 
            -
                }
         | 
| 317 | 
            -
                
         | 
| 318 | 
            -
                void play(bool looping)
         | 
| 319 | 
            -
                {
         | 
| 320 | 
            -
                    applyVolume();
         | 
| 321 | 
            -
                    if (looping != loop)
         | 
| 322 | 
            -
                        stream->setRepeat(loop = looping);
         | 
| 323 | 
            -
                    stream->play();
         | 
| 324 | 
            -
                }
         | 
| 325 | 
            -
             | 
| 326 | 
            -
                bool playing() const
         | 
| 327 | 
            -
                {
         | 
| 328 | 
            -
                    return instance.playing();
         | 
| 329 | 
            -
                }
         | 
| 330 | 
            -
             | 
| 331 | 
            -
                bool paused() const
         | 
| 332 | 
            -
                {
         | 
| 333 | 
            -
                    return instance.paused();
         | 
| 334 | 
            -
                }
         | 
| 335 | 
            -
                
         | 
| 336 | 
            -
                void pause()
         | 
| 337 | 
            -
                {
         | 
| 338 | 
            -
                    instance.pause();
         | 
| 339 | 
            -
                }
         | 
| 340 | 
            -
                
         | 
| 341 | 
            -
                void stop()
         | 
| 342 | 
            -
                {
         | 
| 343 | 
            -
                    instance.stop();
         | 
| 344 | 
            -
                    stream->reset();
         | 
| 345 | 
            -
                }
         | 
| 346 | 
            -
                
         | 
| 347 | 
            -
                void applyVolume()
         | 
| 348 | 
            -
                {
         | 
| 349 | 
            -
                    instance.changeVolume(volume());
         | 
| 350 | 
            -
                }
         | 
| 351 | 
            -
            };
         | 
| 352 | 
            -
             | 
| 353 | 
            -
            Gosu::Song::Song(const std::wstring& filename)
         | 
| 354 | 
            -
            : data(new StreamData(filename))
         | 
| 355 | 
            -
            {
         | 
| 356 | 
            -
            }
         | 
| 357 | 
            -
             | 
| 358 | 
            -
            Gosu::Song::Song(Reader reader)
         | 
| 359 | 
            -
            : data(new StreamData(reader))
         | 
| 360 | 
            -
            {
         | 
| 361 | 
            -
            }
         | 
| 362 | 
            -
             | 
| 363 | 
            -
            Gosu::Song::~Song()
         | 
| 364 | 
            -
            {
         | 
| 365 | 
            -
            }
         | 
| 366 | 
            -
             | 
| 367 | 
            -
            Gosu::Song* Gosu::Song::currentSong()
         | 
| 368 | 
            -
            {
         | 
| 369 | 
            -
                if (curSong && (curSong->playing() || curSong->paused()))
         | 
| 370 | 
            -
                    return curSong;
         | 
| 371 | 
            -
                return curSong = 0;
         | 
| 372 | 
            -
            }
         | 
| 373 | 
            -
             | 
| 374 | 
            -
            void Gosu::Song::play(bool looping)
         | 
| 375 | 
            -
            {
         | 
| 376 | 
            -
                if (Gosu::Song* cur = currentSong())
         | 
| 377 | 
            -
                    if (cur != this)
         | 
| 378 | 
            -
                    {
         | 
| 379 | 
            -
                        cur->stop();
         | 
| 380 | 
            -
                        assert (currentSong() == 0);
         | 
| 381 | 
            -
                    }
         | 
| 382 | 
            -
             | 
| 383 | 
            -
                data->play(looping); // May be redundant
         | 
| 384 | 
            -
                curSong = this;      // May be redundant
         | 
| 385 | 
            -
            }
         | 
| 386 | 
            -
             | 
| 387 | 
            -
            void Gosu::Song::pause()
         | 
| 388 | 
            -
            {
         | 
| 389 | 
            -
                if (curSong == this && data->playing())
         | 
| 390 | 
            -
                    data->pause();
         | 
| 391 | 
            -
            }
         | 
| 392 | 
            -
             | 
| 393 | 
            -
            bool Gosu::Song::paused() const
         | 
| 394 | 
            -
            {
         | 
| 395 | 
            -
                return curSong == this && data->paused();
         | 
| 396 | 
            -
            }
         | 
| 397 | 
            -
             | 
| 398 | 
            -
            void Gosu::Song::stop()
         | 
| 399 | 
            -
            {
         | 
| 400 | 
            -
                if (curSong == this)
         | 
| 401 | 
            -
                {
         | 
| 402 | 
            -
                    data->stop();
         | 
| 403 | 
            -
                    curSong = 0;
         | 
| 404 | 
            -
                }
         | 
| 405 | 
            -
            }
         | 
| 406 | 
            -
             | 
| 407 | 
            -
            bool Gosu::Song::playing() const
         | 
| 408 | 
            -
            {
         | 
| 409 | 
            -
                assert (!(curSong != this && data->playing()));
         | 
| 410 | 
            -
                return data->playing();
         | 
| 411 | 
            -
            }
         | 
| 412 | 
            -
             | 
| 413 | 
            -
            double Gosu::Song::volume() const
         | 
| 414 | 
            -
            {
         | 
| 415 | 
            -
                return data->volume();
         | 
| 416 | 
            -
            }
         | 
| 417 | 
            -
             | 
| 418 | 
            -
            void Gosu::Song::changeVolume(double volume)
         | 
| 419 | 
            -
            {
         | 
| 420 | 
            -
                data->changeVolume(volume);
         | 
| 421 | 
            -
            }
         | 
| 422 | 
            -
             | 
| 423 | 
            -
            void Gosu::Song::update()
         | 
| 424 | 
            -
            {
         | 
| 425 | 
            -
                device()->update();
         | 
| 426 | 
            -
            }
         | 
| 427 | 
            -
             | 
| 428 | 
            -
            // Deprecated constructors.
         | 
| 429 | 
            -
             | 
| 430 | 
            -
            Gosu::Sample::Sample(Audio& audio, const std::wstring& filename)
         | 
| 431 | 
            -
            {
         | 
| 432 | 
            -
                Sample(filename).data.swap(data);
         | 
| 433 | 
            -
            }
         | 
| 434 | 
            -
             | 
| 435 | 
            -
            Gosu::Sample::Sample(Audio& audio, Reader reader)
         | 
| 436 | 
            -
            {
         | 
| 437 | 
            -
                Sample(reader).data.swap(data);
         | 
| 438 | 
            -
            }
         | 
| 439 | 
            -
             | 
| 440 | 
            -
            Gosu::Song::Song(Audio& audio, const std::wstring& filename)
         | 
| 441 | 
            -
            {
         | 
| 442 | 
            -
                Song(filename).data.swap(data);
         | 
| 443 | 
            -
            }
         | 
| 444 | 
            -
             | 
| 445 | 
            -
            Gosu::Song::Song(Audio& audio, Type type, Reader reader)
         | 
| 446 | 
            -
            {
         | 
| 447 | 
            -
                Song(reader).data.swap(data);
         | 
| 448 | 
            -
            }
         |