gosu 0.10.6 → 0.10.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7e0dac99c81c5a229672c489a3b4a7b4cadb588
4
- data.tar.gz: 13fc464f740ed462b7669f27a19f912b19566692
3
+ metadata.gz: 59c5dceec74b7859dc96acf2a9e32f20dd3b62c3
4
+ data.tar.gz: 8ac26d8b8d1e74459c29e96b69079a5ba011c5df
5
5
  SHA512:
6
- metadata.gz: d4d75d8e44a3dac0d7cea92e1b09d5cfe9ec100de7483992e74c6292d6223e0de2d94d28aa8a56a7bce31c1b3dab7026b48504576de9fbc5325ebb367d9ff73d
7
- data.tar.gz: a5e0d9396708b8706b5f0a90f2e2ba6a3294edd7361894665253cc4918295097cf1a43400e0a5ba60941e759a78f867c8940959556a2c24786253e18c8db1ee4
6
+ metadata.gz: e25c8c25c6590a2e7edff4a85c6117b0713ae2777cc876960f35205f0e28b2db62dc9cf763659c092781f015dd1cce133b6d11653e1fc4825406f9a2b4e84b44
7
+ data.tar.gz: 5e91b843c9f632277ee54546d9c97dda40b6067ca49b6ee1cca1230c7a1b710eb0b0df9006b6903ec5a3f62d3888e5e367d88fe899da1f06945be6d57c8b509f
data/COPYING CHANGED
@@ -19,4 +19,4 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19
19
  DEALINGS IN THE SOFTWARE.
20
20
 
21
21
  Julian Raschke <julian@raschke.de> & contributors
22
- http://www.libgosu.org/
22
+ https://www.libgosu.org/
@@ -5,7 +5,7 @@
5
5
  //!
6
6
  //! These pages serve as a reference on the C++ interface of Gosu. For a higher-level
7
7
  //! discussion of concepts and ideas behind the library, see the Wiki entries linked
8
- //! from the official website, http://www.libgosu.org/.
8
+ //! from the official website, https://www.libgosu.org/.
9
9
 
10
10
  #ifndef GOSU_GOSU_HPP
11
11
  #define GOSU_GOSU_HPP
@@ -3,13 +3,13 @@
3
3
 
4
4
  #define GOSU_MAJOR_VERSION 0
5
5
  #define GOSU_MINOR_VERSION 10
6
- #define GOSU_POINT_VERSION 6
7
- #define GOSU_VERSION "0.10.6"
6
+ #define GOSU_POINT_VERSION 7
7
+ #define GOSU_VERSION "0.10.7"
8
8
 
9
9
  #define GOSU_COPYRIGHT_NOTICE \
10
10
  "This software uses the following third-party libraries:\n" \
11
11
  "\n" \
12
- "Gosu, http://www.libgosu.org, MIT License, http://opensource.org/licenses/MIT\n" \
12
+ "Gosu, https://www.libgosu.org, MIT License, http://opensource.org/licenses/MIT\n" \
13
13
  "SDL 2, http://www.libsdl.org, MIT License, http://opensource.org/licenses/MIT\n" \
14
14
  "libsndfile, http://www.mega-nerd.com/libsndfile, GNU LGPL 3, http://www.gnu.org/copyleft/lesser.html\n" \
15
15
  "OpenAL Soft, http://kcat.strangesoft.net/openal.html, GNU LGPL 2, http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html\n"
data/README.md CHANGED
@@ -14,3 +14,7 @@ Complaints, questions, feedback?
14
14
  - Visit the [boards](https://www.libgosu.org/)
15
15
  - Try your luck in the (mostly idle) [IRC channel](https://webchat.freenode.net/?channels=gosu)
16
16
  - Or [email me](mailto:julian@raschke.de) :)
17
+
18
+ [![Build Status](https://travis-ci.org/gosu/gosu.svg?branch=master)](https://travis-ci.org/gosu/gosu) Linux and OS X builds
19
+
20
+ [![Build status](https://ci.appveyor.com/api/projects/status/v0liohs47jono1eq?svg=true)](https://ci.appveyor.com/project/gosu-ci/gosu) Windows builds
@@ -11,9 +11,9 @@ end
11
11
  puts 'The Gosu gem requires some libraries to be installed system-wide.'
12
12
  puts 'See the following site for a list:'
13
13
  if `uname`.chomp == "Darwin" then
14
- puts 'https://github.com/jlnr/gosu/wiki/Getting-Started-on-OS-X'
14
+ puts 'https://github.com/gosu/gosu/wiki/Getting-Started-on-OS-X'
15
15
  else
16
- puts 'https://github.com/jlnr/gosu/wiki/Getting-Started-on-Linux'
16
+ puts 'https://github.com/gosu/gosu/wiki/Getting-Started-on-Linux'
17
17
  end
18
18
  puts
19
19
 
@@ -134,8 +134,8 @@ end
134
134
  # inside folders, it will not find the resulting .o files during linking.
135
135
  # So we create a shim .c/.cpp file for each file that we want to compile, ensuring
136
136
  # that all .o files are built into the current directory, without any nesting.
137
- # TODO - would be nicer if the Rakefile would just create these shim files and
138
- # ship them along with the gem
137
+ # TODO: Just move all of Gosu's source files back into a flat hierarchy again.
138
+ # The nested directory structure has really not been worth it.
139
139
  SOURCE_FILES.each do |file|
140
140
  shim_name = file.gsub('/', '-').sub(/\.mm$/, '.cpp')
141
141
  File.open(shim_name, "w") do |shim|
@@ -143,11 +143,11 @@ SOURCE_FILES.each do |file|
143
143
  end
144
144
  end
145
145
 
146
- if RUBY_VERSION >= '2.0.0' then
147
- # In some versions of Ruby 2.x, the $CXXFLAGS variable is ignored, and $CLAGS
148
- # are not being inherited into it either. In these versions of Ruby we can
149
- # modify CONFIG instead, and our changes will end up in the Makefile.
146
+ if RUBY_VERSION >= '1.9.3' and RUBY_VERSION < '2.2.0' then
147
+ # In some versions of Ruby and mkmf, the $CXXFLAGS variable is badly broken.
148
+ # We can modify CONFIG instead, and our changes will end up in the Makefile.
150
149
  # See http://bugs.ruby-lang.org/issues/8315
150
+ # The lower bound was reduced to 1.9.3 here: https://github.com/gosu/gosu/issues/321
151
151
  CONFIG['CXXFLAGS'] = "#$CFLAGS #$CXXFLAGS"
152
152
  end
153
153
 
@@ -3098,14 +3098,14 @@ bool SwigDirector_Window::tick() {
3098
3098
  void SwigDirector_Window::update() {
3099
3099
  VALUE result;
3100
3100
 
3101
- result = rb_funcall(swig_get_self(), rb_intern("protected_update"), 0, NULL);
3101
+ result = rb_funcall(swig_get_self(), rb_intern("update"), 0, NULL);
3102
3102
  }
3103
3103
 
3104
3104
 
3105
3105
  void SwigDirector_Window::draw() {
3106
3106
  VALUE result;
3107
3107
 
3108
- result = rb_funcall(swig_get_self(), rb_intern("protected_draw_2"), 0, NULL);
3108
+ result = rb_funcall(swig_get_self(), rb_intern("draw"), 0, NULL);
3109
3109
  }
3110
3110
 
3111
3111
 
@@ -3113,7 +3113,7 @@ bool SwigDirector_Window::needsRedraw() const {
3113
3113
  bool c_result ;
3114
3114
  VALUE result;
3115
3115
 
3116
- result = rb_funcall(swig_get_self(), rb_intern("protected_needs_redraw?"), 0, NULL);
3116
+ result = rb_funcall(swig_get_self(), rb_intern("needs_redraw?"), 0, NULL);
3117
3117
  bool swig_val;
3118
3118
  int swig_res = SWIG_AsVal_bool(result, &swig_val);
3119
3119
  if (!SWIG_IsOK(swig_res)) {
@@ -3128,7 +3128,7 @@ bool SwigDirector_Window::needsCursor() const {
3128
3128
  bool c_result ;
3129
3129
  VALUE result;
3130
3130
 
3131
- result = rb_funcall(swig_get_self(), rb_intern("protected_needs_cursor?"), 0, NULL);
3131
+ result = rb_funcall(swig_get_self(), rb_intern("needs_cursor?"), 0, NULL);
3132
3132
  bool swig_val;
3133
3133
  int swig_res = SWIG_AsVal_bool(result, &swig_val);
3134
3134
  if (!SWIG_IsOK(swig_res)) {
@@ -3142,7 +3142,7 @@ bool SwigDirector_Window::needsCursor() const {
3142
3142
  void SwigDirector_Window::loseFocus() {
3143
3143
  VALUE result;
3144
3144
 
3145
- result = rb_funcall(swig_get_self(), rb_intern("protected_lose_focus"), 0, NULL);
3145
+ result = rb_funcall(swig_get_self(), rb_intern("lose_focus"), 0, NULL);
3146
3146
  }
3147
3147
 
3148
3148
 
@@ -3163,7 +3163,7 @@ void SwigDirector_Window::buttonDown(Gosu::Button arg0) {
3163
3163
  else
3164
3164
  obj0 = LONG2NUM((&arg0)->id());
3165
3165
  }
3166
- result = rb_funcall(swig_get_self(), rb_intern("protected_button_down"), 1,obj0);
3166
+ result = rb_funcall(swig_get_self(), rb_intern("button_down"), 1,obj0);
3167
3167
  }
3168
3168
 
3169
3169
 
@@ -3177,7 +3177,7 @@ void SwigDirector_Window::buttonUp(Gosu::Button arg0) {
3177
3177
  else
3178
3178
  obj0 = LONG2NUM((&arg0)->id());
3179
3179
  }
3180
- result = rb_funcall(swig_get_self(), rb_intern("protected_button_up"), 1,obj0);
3180
+ result = rb_funcall(swig_get_self(), rb_intern("button_up"), 1,obj0);
3181
3181
  }
3182
3182
 
3183
3183
 
@@ -11342,6 +11342,11 @@ SWIGEXPORT void Init_gosu(void) {
11342
11342
  rb_define_const(mGosu, "Gp3Button13", SWIG_From_int(static_cast< int >(Gosu::gp3Button13)));
11343
11343
  rb_define_const(mGosu, "Gp3Button14", SWIG_From_int(static_cast< int >(Gosu::gp3Button14)));
11344
11344
  rb_define_const(mGosu, "Gp3Button15", SWIG_From_int(static_cast< int >(Gosu::gp3Button15)));
11345
+
11346
+ // Call srand() so that Gosu::random() is actually random in Ruby scripts
11347
+ std::srand(static_cast<unsigned int>(std::time(0)));
11348
+ std::rand(); // and flush the first value
11349
+
11345
11350
  rb_define_module_function(mGosu, "disown_TextInput", VALUEFUNC(_wrap_disown_TextInput), -1);
11346
11351
 
11347
11352
  SwigClassTextInput.klass = rb_define_class_under(mGosu, "TextInput", rb_cObject);
@@ -2,72 +2,27 @@
2
2
  #define GOSU_APPLEUTILITY_HPP
3
3
 
4
4
  #include <Gosu/Platform.hpp>
5
+ #include <CoreFoundation/CoreFoundation.h>
5
6
 
6
7
  #ifdef __OBJC__
7
8
 
8
- #include <iostream>
9
- #include <ostream>
10
- #include <sstream>
11
9
  #include <string>
12
10
  #include <stdexcept>
13
- #include <objc/objc.h>
14
- #import <CoreFoundation/CoreFoundation.h>
15
11
  #import <Foundation/Foundation.h>
16
12
 
17
- namespace Gosu
13
+ inline static void throwOSError(OSStatus status, unsigned line)
18
14
  {
19
- inline void throwOSError(OSStatus status, unsigned line)
20
- {
21
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
15
+ @autoreleasepool {
22
16
  NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
23
- std::ostringstream str;
24
- str << "Error on line " << line << " (Code " << status << "): "
25
- << [[error localizedDescription] UTF8String]
26
- << " (" << [[error description] UTF8String] << ")";
27
- [pool release];
28
- throw std::runtime_error(str.str());
17
+ throw std::runtime_error("Error on line " + std::to_string(line) +
18
+ " (Code " + std::to_string(status) + "): " +
19
+ error.localizedDescription.UTF8String +
20
+ " (" + error.description.UTF8String + ")");
29
21
  }
30
-
31
- #define CHECK_OS(status) if (!(status)) {} else Gosu::throwOSError(status, __LINE__)
32
-
33
- template<typename T>
34
- class ObjCRef
35
- {
36
- ObjCRef(const ObjCRef&);
37
- ObjCRef& operator=(const ObjCRef&);
38
-
39
- T* ptr;
40
-
41
- public:
42
- ObjCRef(T* ptr = nil)
43
- : ptr(ptr)
44
- {
45
- }
46
-
47
- ~ObjCRef()
48
- {
49
- [ptr release];
50
- }
51
-
52
- void reset(T* newPtr = nil)
53
- {
54
- [ptr release];
55
- ptr = newPtr;
56
- }
57
-
58
- T* get() const
59
- {
60
- return ptr;
61
- }
62
-
63
- T* obj() const
64
- {
65
- if (!ptr)
66
- throw std::logic_error("Objective-C reference is nil");
67
- return ptr;
68
- }
69
- };
70
22
  }
23
+
24
+ #define CHECK_OS(status) do { if (status) throwOSError(status, __LINE__); } while (0)
25
+
71
26
  #endif
72
27
 
73
28
  namespace Gosu
@@ -75,23 +30,24 @@ namespace Gosu
75
30
  template<typename CFRefType = CFTypeRef>
76
31
  class CFRef
77
32
  {
78
- CFRef(const CFRef&);
79
- CFRef& operator=(const CFRef&);
80
-
81
33
  CFRefType ref;
82
34
 
83
35
  public:
84
36
  CFRef(CFRefType ref)
85
- : ref(ref)
37
+ : ref(ref)
86
38
  {
87
39
  }
88
40
 
89
41
  ~CFRef()
90
42
  {
91
- if (ref)
43
+ if (ref) {
92
44
  CFRelease(ref);
45
+ }
93
46
  }
94
-
47
+
48
+ CFRef(const CFRef&) = delete;
49
+ CFRef& operator=(const CFRef&) = delete;
50
+
95
51
  CFRefType get() const
96
52
  {
97
53
  return ref;
@@ -99,8 +55,9 @@ namespace Gosu
99
55
 
100
56
  CFRefType obj() const
101
57
  {
102
- if (!ref)
58
+ if (!ref) {
103
59
  throw std::logic_error("CoreFoundation reference is NULL");
60
+ }
104
61
  return ref;
105
62
  }
106
63
  };
@@ -58,15 +58,18 @@ namespace
58
58
  // TODO: What is this NSAutoreleasePool good for?
59
59
  #ifdef GOSU_IS_MAC
60
60
  #include "../AppleUtility.hpp"
61
- #define CONSTRUCTOR_COMMON \
62
- ObjCRef<NSAutoreleasePool> pool([NSAutoreleasePool new]); \
61
+ #define CONSTRUCTOR_BEGIN \
62
+ @autoreleasepool { \
63
63
  if (!alChannelManagement.get()) \
64
64
  alChannelManagement.reset(new ALChannelManagement)
65
+ #define CONSTRUCTOR_END \
66
+ }
65
67
  #else
66
- #define CONSTRUCTOR_COMMON \
68
+ #define CONSTRUCTOR_BEGIN \
67
69
  if (!alChannelManagement.get()) \
68
70
  alChannelManagement.reset(new ALChannelManagement)
69
- #endif
71
+ #define CONSTRUCTOR_END
72
+ #endif
70
73
 
71
74
  Gosu::SampleInstance::SampleInstance(int handle, int extra)
72
75
  : handle(handle), extra(extra)
@@ -175,7 +178,7 @@ private:
175
178
 
176
179
  Gosu::Sample::Sample(const std::wstring& filename)
177
180
  {
178
- CONSTRUCTOR_COMMON;
181
+ CONSTRUCTOR_BEGIN;
179
182
 
180
183
  if (isOggFile(filename))
181
184
  {
@@ -189,11 +192,13 @@ Gosu::Sample::Sample(const std::wstring& filename)
189
192
  WAVE_FILE audioFile(filename);
190
193
  data.reset(new SampleData(audioFile));
191
194
  }
195
+
196
+ CONSTRUCTOR_END
192
197
  }
193
198
 
194
199
  Gosu::Sample::Sample(Reader reader)
195
200
  {
196
- CONSTRUCTOR_COMMON;
201
+ CONSTRUCTOR_BEGIN;
197
202
 
198
203
  if (isOggFile(reader))
199
204
  {
@@ -205,6 +210,8 @@ Gosu::Sample::Sample(Reader reader)
205
210
  WAVE_FILE audioFile(reader);
206
211
  data.reset(new SampleData(audioFile));
207
212
  }
213
+
214
+ CONSTRUCTOR_END
208
215
  }
209
216
 
210
217
  Gosu::SampleInstance Gosu::Sample::play(double volume, double speed,
@@ -219,7 +226,7 @@ Gosu::SampleInstance Gosu::Sample::playPan(double pan, double volume,
219
226
  std::pair<int, int> channelAndToken = alChannelManagement->reserveChannel();
220
227
  if (channelAndToken.first == ALChannelManagement::NO_FREE_CHANNEL)
221
228
  return Gosu::SampleInstance(channelAndToken.first, channelAndToken.second);
222
-
229
+
223
230
  ALuint source = alChannelManagement->sourceIfStillPlaying(channelAndToken.first,
224
231
  channelAndToken.second);
225
232
  assert(source != ALChannelManagement::NO_SOURCE);
@@ -272,49 +279,49 @@ public:
272
279
  // AVAudioPlayer impl
273
280
  class Gosu::Song::ModuleData : public BaseData
274
281
  {
275
- ObjCRef<AVAudioPlayer> player;
282
+ AVAudioPlayer *player;
276
283
 
277
284
  void applyVolume()
278
285
  {
279
- player.obj().volume = volume();
286
+ player.volume = volume();
280
287
  }
281
288
 
282
289
  public:
283
290
  ModuleData(const std::wstring& filename)
284
291
  {
285
292
  std::string utf8Filename = Gosu::wstringToUTF8(filename);
286
- ObjCRef<NSString> nsFilename([[NSString alloc] initWithUTF8String:utf8Filename.c_str()]);
287
- ObjCRef<NSURL> url([[NSURL alloc] initFileURLWithPath:nsFilename.obj()]);
288
- player.reset([[AVAudioPlayer alloc] initWithContentsOfURL:url.obj() error:NULL]);
293
+ NSURL *URL = [NSURL fileURLWithPath:[NSString stringWithUTF8String:utf8Filename.c_str()]];
294
+ player = [[AVAudioPlayer alloc] initWithContentsOfURL:URL error:NULL];
289
295
  }
290
296
 
291
297
  void play(bool looping)
292
298
  {
293
- if (paused())
299
+ if (paused()) {
294
300
  stop();
295
- player.obj().numberOfLoops = looping ? -1 : 0;
296
- [player.obj() play];
301
+ }
302
+ player.numberOfLoops = looping ? -1 : 0;
303
+ [player play];
297
304
  }
298
305
 
299
306
  void pause()
300
307
  {
301
- [player.obj() pause];
308
+ [player pause];
302
309
  }
303
310
 
304
311
  void resume()
305
312
  {
306
- [player.obj() play];
313
+ [player play];
307
314
  }
308
315
 
309
316
  bool paused() const
310
317
  {
311
- return !player.obj().playing;
318
+ return !player.playing;
312
319
  };
313
320
 
314
321
  void stop()
315
322
  {
316
- [player.obj() stop];
317
- player.obj().currentTime = 0;
323
+ [player stop];
324
+ player.currentTime = 0;
318
325
  }
319
326
 
320
327
  void update()
@@ -507,16 +514,17 @@ Gosu::Song::Song(const std::wstring& filename)
507
514
  else
508
515
  #endif
509
516
  {
510
- CONSTRUCTOR_COMMON;
517
+ CONSTRUCTOR_BEGIN;
511
518
  data.reset(new StreamData(filename));
519
+ CONSTRUCTOR_END
512
520
  }
513
521
  }
514
522
 
515
523
  Gosu::Song::Song(Reader reader)
516
524
  {
517
- CONSTRUCTOR_COMMON;
518
-
525
+ CONSTRUCTOR_BEGIN;
519
526
  data.reset(new StreamData(reader));
527
+ CONSTRUCTOR_END
520
528
  }
521
529
 
522
530
  Gosu::Song::~Song()
@@ -29,7 +29,7 @@ namespace Gosu
29
29
  ALuint sampleRate_;
30
30
  UInt32 bytesPerFrame_;
31
31
  bool bigEndian_;
32
-
32
+
33
33
  static OSStatus AudioFile_ReadProc(void* inClientData, SInt64 inPosition,
34
34
  UInt32 requestCount, void* buffer, UInt32* actualCount)
35
35
  {
@@ -81,9 +81,7 @@ namespace Gosu
81
81
 
82
82
  initSeekOffset();
83
83
 
84
- format_ = clientData.mChannelsPerFrame == 1 ?
85
- AL_FORMAT_MONO16 :
86
- AL_FORMAT_STEREO16;
84
+ format_ = clientData.mChannelsPerFrame == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
87
85
  }
88
86
 
89
87
  void init()
@@ -124,26 +122,28 @@ namespace Gosu
124
122
  }
125
123
 
126
124
  if (format_ == 0 ||
127
- // If format not native for OpenAL, set client data format
128
- // to enable conversion
129
- desc.mFormatFlags & kAudioFormatFlagIsBigEndian ||
130
- desc.mFormatFlags & kAudioFormatFlagIsFloat ||
131
- !(desc.mFormatFlags & kAudioFormatFlagIsSignedInteger))
132
- initClientFormatBasedOn(desc);
133
- else
125
+ // If format not native for OpenAL, set client data format
126
+ // to enable conversion
127
+ desc.mFormatFlags & kAudioFormatFlagIsBigEndian ||
128
+ desc.mFormatFlags & kAudioFormatFlagIsFloat ||
129
+ !(desc.mFormatFlags & kAudioFormatFlagIsSignedInteger)) {
130
+ initClientFormatBasedOn(desc);
131
+ }
132
+ else {
134
133
  // Just set the old format as the client format so
135
134
  // ExtAudioFileSeek will work for us.
136
135
  CHECK_OS(ExtAudioFileSetProperty(file_,
137
136
  kExtAudioFileProperty_ClientDataFormat,
138
137
  sizeof desc, &desc));
138
+ }
139
139
  }
140
140
 
141
141
  public:
142
142
  AudioToolboxFile(const std::wstring& filename)
143
143
  {
144
- ObjCRef<NSString> utf8Filename([[NSString alloc] initWithUTF8String:wstringToUTF8(filename).c_str()]);
145
- ObjCRef<NSURL> url([[NSURL alloc] initFileURLWithPath:utf8Filename.get()]);
146
- CHECK_OS(ExtAudioFileOpenURL((CFURLRef)url.get(), &file_));
144
+ NSString *utf8Filename = [NSString stringWithUTF8String:wstringToUTF8(filename).c_str()];
145
+ NSURL *URL = [NSURL fileURLWithPath:utf8Filename];
146
+ CHECK_OS(ExtAudioFileOpenURL((__bridge CFURLRef)URL, &file_));
147
147
 
148
148
  fileID_ = 0;
149
149
 
@@ -155,14 +155,14 @@ namespace Gosu
155
155
  buffer_.resize(reader.resource().size() - reader.position());
156
156
  reader.read(buffer_.data(), buffer_.size());
157
157
 
158
- // TODO: For some reason, this fails on the iPhone with at least MP3 files.
159
- // If this turns into a serious problem, the plain AudioFile API could be
160
- // used which works for non-compressed formats at least.
158
+ // TODO: This fails on iOS with MP3 files.
159
+ // TODO: ^ Is the comment above still true on non-ancient iOS versions?
161
160
 
162
161
  void* clientData = &buffer_;
163
162
  CHECK_OS(AudioFileOpenWithCallbacks(clientData, AudioFile_ReadProc, 0,
164
163
  AudioFile_GetSizeProc, 0, 0, &fileID_));
165
164
  CHECK_OS(ExtAudioFileWrapAudioFileID(fileID_, false, &file_));
165
+
166
166
  init();
167
167
  }
168
168
 
@@ -170,8 +170,9 @@ namespace Gosu
170
170
  {
171
171
  ExtAudioFileDispose(file_);
172
172
 
173
- if (fileID_)
173
+ if (fileID_) {
174
174
  AudioFileClose(fileID_);
175
+ }
175
176
  }
176
177
 
177
178
  ALenum format() const