You can subscribe to this list here.
| 2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(25) |
Jul
(288) |
Aug
(119) |
Sep
(31) |
Oct
(59) |
Nov
(458) |
Dec
(359) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2010 |
Jan
(268) |
Feb
(26) |
Mar
(36) |
Apr
(48) |
May
(119) |
Jun
(37) |
Jul
(173) |
Aug
(429) |
Sep
(137) |
Oct
(156) |
Nov
(59) |
Dec
(45) |
| 2011 |
Jan
(398) |
Feb
(257) |
Mar
(49) |
Apr
(5) |
May
(34) |
Jun
(11) |
Jul
(38) |
Aug
(12) |
Sep
(1) |
Oct
(49) |
Nov
(5) |
Dec
(10) |
| 2012 |
Jan
(21) |
Feb
(32) |
Mar
(20) |
Apr
(1) |
May
(2) |
Jun
|
Jul
(173) |
Aug
|
Sep
(25) |
Oct
(6) |
Nov
(44) |
Dec
|
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:42
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Sat Jul 21 21:06:42 2012 -0300
Midi Synth:
- Added basic fluidsynth support (optional via cmake).
- Soundfont download needed (named as TimGM6mb.sf2).
- Midi instruments can be tested on practice screen.
---
cmake/Modules/FindFluidSynth.cmake | 22 +++++++++
game/CMakeLists.txt | 14 ++++++
game/fluidsynth.cc | 91 ++++++++++++++++++++++++++++++++++++
game/fluidsynth.hh | 71 ++++++++++++++++++++++++++++
game/input_midi.cc | 13 ++++-
game/main.cc | 5 ++
6 files changed, 214 insertions(+), 2 deletions(-)
diff --git a/cmake/Modules/FindFluidSynth.cmake b/cmake/Modules/FindFluidSynth.cmake
new file mode 100644
index 0000000..e668c8f
--- /dev/null
+++ b/cmake/Modules/FindFluidSynth.cmake
@@ -0,0 +1,22 @@
+# - Find fluidsynth
+# Find the native fluidsynth includes and library
+#
+# FLUIDSYNTH_INCLUDE_DIR - where to find fluidsynth.h
+# FLUIDSYNTH_LIBRARIES - List of libraries when using fluidsynth.
+# FLUIDSYNTH_FOUND - True if fluidsynth found.
+
+
+IF (FLUIDSYNTH_INCLUDE_DIR AND FLUIDSYNTH_LIBRARIES)
+ # Already in cache, be silent
+ SET(FluidSynth_FIND_QUIETLY TRUE)
+ENDIF (FLUIDSYNTH_INCLUDE_DIR AND FLUIDSYNTH_LIBRARIES)
+
+FIND_PATH(FLUIDSYNTH_INCLUDE_DIR fluidsynth.h)
+
+FIND_LIBRARY(FLUIDSYNTH_LIBRARIES NAMES fluidsynth )
+MARK_AS_ADVANCED( FLUIDSYNTH_LIBRARIES FLUIDSYNTH_INCLUDE_DIR )
+
+# handle the QUIETLY and REQUIRED arguments and set FLUIDSYNTH_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(FluidSynth DEFAULT_MSG FLUIDSYNTH_LIBRARIES FLUIDSYNTH_INCLUDE_DIR)
diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt
index f92c742..6ed0b6b 100644
--- a/game/CMakeLists.txt
+++ b/game/CMakeLists.txt
@@ -102,6 +102,20 @@ else()
message(STATUS "MIDI I/O: Disabled (explicitly disabled)")
endif()
+if(NOT NO_FLUIDSYNTH)
+ find_package(FluidSynth)
+ if(FLUIDSYNTH_FOUND)
+ include_directories(${FLUIDSYNTH_INCLUDE_DIRS})
+ list(APPEND LIBS ${FLUIDSYNTH_LIBRARIES})
+ add_definitions("-DUSE_FLUIDSYNTH")
+ message(STATUS "FluidSynth support: Enabled")
+ else()
+ message(STATUS "FluidSynth support: Disabled (libfluidsynth not found)")
+ endif()
+else()
+ message(STATUS "FluidSynth support: Disabled (explicitly disabled)")
+endif()
+
if(NOT NO_WEBCAM)
find_package(OpenCV)
if(OpenCV_FOUND)
diff --git a/game/fluidsynth.cc b/game/fluidsynth.cc
new file mode 100644
index 0000000..5e3cb2d
--- /dev/null
+++ b/game/fluidsynth.cc
@@ -0,0 +1,91 @@
+#include "fluidsynth.hh"
+
+synth::FluidPtr synth::midiSynth;
+
+// TODO: add error handling
+
+#ifdef USE_FLUIDSYNTH
+
+synth::Fluid::Fluid() {
+ _settings = new_fluid_settings();
+ _synth = new_fluid_synth(_settings);
+
+ // TODO: remove this and implement audioOut function instead
+ // this config is here only for testing purposes
+ fluid_settings_setstr(_settings, "audio.driver", "pulseaudio");
+
+ _adriver = new_fluid_audio_driver(_settings, _synth);
+
+ // Set audio gain from 0.2 to 2.5 (affects output volume)
+ fluid_settings_setnum(_settings, "synth.gain", 2.0);
+
+
+ // TODO: improve soundfont loading (or add a default soundfont)
+ // TimGM6mb.sf2 (public domain soundfont) being used to test
+ fs::path sf_file = getDataDir() / "TimGM6mb.sf2";
+
+ if (!fs::exists(sf_file)) {
+ std::cout << "##" << std::endl;
+ std::cout << "## synth/info: Skipping " << sf_file << std::endl;
+ std::cout << "## TimGM6mb.sf2 soundfont not found, please download it to the data folder" << std::endl;
+ std::cout << "## Soundfont's webpage: http://musescore.org/en/handbook/soundfont/" << std::endl;
+ std::cout << "##" << std::endl;
+ } else sf_id = fontLoad(sf_file.string());
+}
+
+synth::Fluid::~Fluid() {
+
+}
+
+int synth::Fluid::fontLoad(std::string sf_filename) {
+ std::cout << sf_filename.c_str() << std::endl;
+ int id = fluid_synth_sfload(_synth, sf_filename.c_str(), true);
+ if(id) return id;
+ throw std::runtime_error("Could not load soundfont");
+}
+
+void synth::Fluid::fontUnload(int id) {
+ fluid_synth_sfunload(_synth, id, true);
+}
+
+void synth::Fluid::sendNoteTimed(int chan, int note, int vel, int msecs) {
+ fluid_synth_noteon(_synth, chan, note, vel);
+
+ boost::this_thread::sleep( boost::posix_time::milliseconds(msecs) );
+
+ fluid_synth_noteoff(_synth, chan, note);
+}
+
+void synth::Fluid::sendNoteOn(int chan, int note, int vel) {
+ fluid_synth_noteon(_synth, chan, note, vel);
+}
+
+void synth::Fluid::sendNoteOff(int chan, int note) {
+ fluid_synth_noteoff(_synth, chan, note);
+}
+
+void synth::Fluid::setGain(float gain) {
+ fluid_synth_set_gain(_synth, gain);
+}
+
+float synth::Fluid::getGain() {
+ return fluid_synth_get_gain(_synth);
+}
+
+// TODO: implement audio output inside the game
+/*
+void synth::Fluid::audioOut() {
+ //use fluid_synth_write_s16() here
+}
+*/
+
+#endif // USE_FLUIDSYNTH
+
+void synth::init() {
+ try {
+ synth::midiSynth.reset(new synth::Fluid());
+ }
+ catch (std::runtime_error& e) {
+ std::clog << "synth/info: " << e.what() << std::endl;
+ }
+}
diff --git a/game/fluidsynth.hh b/game/fluidsynth.hh
new file mode 100644
index 0000000..d120af3
--- /dev/null
+++ b/game/fluidsynth.hh
@@ -0,0 +1,71 @@
+#pragma once
+
+#include <stdexcept>
+#include <iostream>
+#include <boost/scoped_ptr.hpp>
+#include <boost/thread/thread.hpp>
+
+#include <fluidsynth.h>
+
+#include "fs.hh"
+
+namespace synth {
+
+#ifdef USE_FLUIDSYNTH
+ class Fluid {
+ /*
+ Common Parameters:
+ _synth FluidSynth instance
+ chan MIDI channel number (0 to MIDI channel count - 1)
+ note MIDI note number (0-127)
+ vel MIDI velocity (0-127, 0=noteoff)
+ sf_id identifier needed to unload the soundfont
+ */
+
+ public:
+ static bool enabled() { return true; }
+ Fluid();
+ ~Fluid();
+ int fontLoad(std::string sf_filename);
+ void fontUnload(int id);
+ void sendNoteTimed(int chan, int note, int vel, int msecs);
+ void sendNoteOn(int chan, int note, int vel);
+ void sendNoteOff(int chan, int note);
+ void setGain(float gain);
+ float getGain();
+ // TODO: implement audio output inside the game
+ // void audioOut();
+
+ private:
+ int sf_id;
+
+ // fluidsynth specific variables
+ fluid_settings_t* _settings;
+ fluid_synth_t* _synth;
+ fluid_audio_driver_t* _adriver;
+
+ };
+#else
+ class Fluid {
+ public:
+ static bool enabled() { return false; }
+ Fluid();
+ int fontLoad(std::string sf_filename);
+ void fontUnload(void) {};
+ void sendNoteTimed(void, void, void, void) {};
+ void sendNoteOn(void, void, void) {};
+ void sendNoteOff(void, void) {};
+ void setGain(void) {};
+ void getGain() {};
+ void audioOut();
+
+ private:
+ };
+
+#endif // USE_FLUIDSYNTH
+
+ typedef boost::scoped_ptr<Fluid> FluidPtr;
+ extern FluidPtr midiSynth;
+
+ void init();
+} // namespace fluid
diff --git a/game/input_midi.cc b/game/input_midi.cc
index 38b23c7..680e854 100644
--- a/game/input_midi.cc
+++ b/game/input_midi.cc
@@ -1,5 +1,9 @@
#include "input.hh"
+#ifdef USE_FLUIDSYNTH
+#include "fluidsynth.hh"
+#endif // USE_FLUIDSYNTH
+
input::midi::MidiDevicePtr input::midi::midiDevice;
#ifdef USE_PORTMIDI
@@ -59,9 +63,14 @@ void input::midi::MidiDevice::process() {
// code snippet left here for visibility
unsigned char chan = ev.message & 0x0F;
if (chan != 0x09) continue; // only accept channel 10 (percussion)
-#endif
+#endif // 0
if (evnt != 0x90) continue; // 0x90 = any channel note-on
if (vel == 0x00) continue; // velocity 0 is often used instead of note-off
+
+#ifdef USE_FLUIDSYNTH
+ synth::midiSynth->sendNoteTimed(0, (int)note, (int)vel, 0);
+#endif // USE_FLUIDSYNTH
+
Map::const_iterator it = map.find(note);
if (it == map.end()) {
std::cout << "Unassigned MIDI drum event: note " << note << std::endl;
@@ -75,7 +84,7 @@ void input::midi::MidiDevice::process() {
}
}
-#endif
+#endif // USE_PORTMIDI
void input::midi::init(input::Instruments& instruments) {
// TODO: Proper error handling...
diff --git a/game/main.cc b/game/main.cc
index 50b265e..773c4f8 100644
--- a/game/main.cc
+++ b/game/main.cc
@@ -2,6 +2,7 @@
#include "fs.hh"
#include "screen.hh"
#include "input.hh"
+#include "fluidsynth.hh"
#include "profiler.hh"
#include "songs.hh"
#include "backgrounds.hh"
@@ -126,6 +127,8 @@ void mainLoop(std::string const& songlist) {
Songs songs(database, songlist);
ScreenManager sm(window);
try {
+ // Initialize midi synthetizer
+ synth::init();
// Load audio samples
sm.loading(_("Loading audio samples..."), 0.5);
audio.loadSample("drum bass", getPath("sounds/drum_bass.ogg"));
@@ -378,5 +381,7 @@ void outputOptionalFeatureStatus() {
(input::midi::MidiDevice::enabled() ? "Enabled" : "Disabled")
<< std::endl << " Webcam support: " <<
(Webcam::enabled() ? "Enabled" : "Disabled")
+ << std::endl << " Fluidsynth support: " <<
+ (synth::Fluid::enabled() ? "Enabled" : "Disabled")
<< std::endl << std::endl;
}
|
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:39
|
Author: Alvaro Fernando Garcia <alv...@gm...> Date: Thu Jul 19 04:41:22 2012 -0300 Input code refactoring: - Renamed MidiDrums class to MidiDevice. - Added mididevice.xml file (for piano and drums mappings). - Removed mididrums.xml and midipiano.xml files. --- data/CMakeLists.txt | 7 ++-- data/mididevice.xml | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++ data/mididrums.xml | 75 --------------------------------------- data/midipiano.xml | 94 -------------------------------------------------- game/input.cc | 2 +- game/input.hh | 16 ++++---- game/input_midi.cc | 20 +++++----- game/main.cc | 2 +- game/video_driver.cc | 2 +- 9 files changed, 118 insertions(+), 194 deletions(-) |
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:36
|
Author: Alvaro Fernando Garcia <alv...@gm...> Date: Thu Jul 19 03:01:38 2012 -0300 Merge branch 'master' into piano --- |
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:34
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Thu Jul 19 03:01:06 2012 -0300
Revert "Fix ffmpeg related compilation issue."
This reverts commit 3d45bd822ff2e4d9ae5843587bac2b9bc608cb06.
---
game/ffmpeg.cc | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index 501c7b6..e4440ed 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -12,8 +12,6 @@ extern "C" {
#include SWSCALE_INCLUDE
}
-#define SAMPLE_FMT_S16 AV_SAMPLE_FMT_S16
-
#define AUDIO_CHANNELS 2
/*static*/ boost::mutex FFmpeg::s_avcodec_mutex;
|
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:31
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Tue Jul 17 07:39:15 2012 -0300
Fix covers draw graphic issue on songs screen.
---
game/screen_songs.cc | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/game/screen_songs.cc b/game/screen_songs.cc
index afe23a1..0d56f26 100644
--- a/game/screen_songs.cc
+++ b/game/screen_songs.cc
@@ -202,8 +202,8 @@ void ScreenSongs::drawMultimedia() {
}
if (!m_jukebox) {
m_songbg_ground->draw();
- drawCovers();
theme->bg.draw();
+ drawCovers();
}
}
|
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:28
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Tue Jul 17 07:36:34 2012 -0300
Fix ffmpeg compile issue.
---
game/ffmpeg.cc | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index e4440ed..ac0889a 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -12,6 +12,10 @@ extern "C" {
#include SWSCALE_INCLUDE
}
+#if (LIBAVCODEC_VERSION_INT) < (AV_VERSION_INT(52,94,3))
+# define AV_SAMPLE_FMT_S16 SAMPLE_FMT_S16
+#endif
+
#define AUDIO_CHANNELS 2
/*static*/ boost::mutex FFmpeg::s_avcodec_mutex;
@@ -66,7 +70,7 @@ void FFmpeg::open() {
switch (m_mediaType) {
case AVMEDIA_TYPE_AUDIO:
- m_resampleContext = av_audio_resample_init(AUDIO_CHANNELS, cc->channels, m_rate, cc->sample_rate, SAMPLE_FMT_S16, SAMPLE_FMT_S16, 16, 10, 0, 0.8);
+ m_resampleContext = av_audio_resample_init(AUDIO_CHANNELS, cc->channels, m_rate, cc->sample_rate, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16, 16, 10, 0, 0.8);
if (!m_resampleContext) throw std::runtime_error("Cannot create resampling context");
audioQueue.setSamplesPerSecond(AUDIO_CHANNELS * m_rate);
break;
|
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:25
|
Author: Lasse Karkkainen <tro...@tr...>
Date: Sat Jul 14 21:25:02 2012 +0300
Mirror webcam image.
---
game/webcam.cc | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/game/webcam.cc b/game/webcam.cc
index b3b66fe..85fa849 100644
--- a/game/webcam.cc
+++ b/game/webcam.cc
@@ -105,6 +105,8 @@ void Webcam::render() {
bitmap.buf.swap(m_frame.data); // Get back our buffer (FIXME: do we need to?)
m_frameAvailable = false;
}
+ using namespace glmath;
+ Transform trans(scale(vec3(-1.0, 1.0, 1.0)));
m_surface.draw(); // Draw
#endif
}
|
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:23
|
Author: Lasse Karkkainen <tro...@tr...>
Date: Tue Jul 10 06:18:44 2012 +0300
Revert "Fix video playback issue in dance mode."
This reverts commit b049a44b8966e8a27f2a91793956322eb2c8d335.
packet.pts contains incorrect timecode, causing B frames to be displayed
out of order. Yes, "pts" stands for "presentation time stamp" but apparently
it still contains decode time stamp values. The timecode system of libav is
retarded.
---
game/ffmpeg.cc | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index 616384e..e4440ed 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -161,8 +161,8 @@ void FFmpeg::decodePacket() {
packetSize -= decodeSize; // Move forward within the packet
if (!frameFinished) continue;
// Update current position if timecode is available
- if (packet.pts != int64_t(AV_NOPTS_VALUE)) {
- m_position = double(packet.pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
+ if (frame->pkt_pts != uint64_t(AV_NOPTS_VALUE)) {
+ m_position = double(frame->pkt_pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
}
if (m_mediaType == AVMEDIA_TYPE_VIDEO) processVideo(frame); else processAudio(frame);
}
|
|
From: rainbyte <rai...@us...> - 2012-07-22 00:13:20
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Tue Jul 10 00:06:37 2012 -0300
Fix video playback issue in dance mode.
---
game/ffmpeg.cc | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index e4440ed..616384e 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -161,8 +161,8 @@ void FFmpeg::decodePacket() {
packetSize -= decodeSize; // Move forward within the packet
if (!frameFinished) continue;
// Update current position if timecode is available
- if (frame->pkt_pts != uint64_t(AV_NOPTS_VALUE)) {
- m_position = double(frame->pkt_pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
+ if (packet.pts != int64_t(AV_NOPTS_VALUE)) {
+ m_position = double(packet.pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
}
if (m_mediaType == AVMEDIA_TYPE_VIDEO) processVideo(frame); else processAudio(frame);
}
|
|
From: Tapio V. <aa...@us...> - 2012-07-18 10:48:21
|
Author: Tapio Vierros <tap...@gm...>
Date: Wed Jul 18 13:47:31 2012 +0300
Webcam: if default resolution is smaller than VGA, try to get VGA.
---
game/webcam.cc | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/game/webcam.cc b/game/webcam.cc
index 85fa849..561dff3 100644
--- a/game/webcam.cc
+++ b/game/webcam.cc
@@ -30,6 +30,17 @@ Webcam::Webcam(int cam_id):
if (!m_capture->isOpened())
throw std::runtime_error("Could not initialize webcam capturing!");
}
+ // Try to get at least VGA resolution
+ if (m_capture->get(CV_CAP_PROP_FRAME_WIDTH) < 640
+ || m_capture->get(CV_CAP_PROP_FRAME_HEIGHT) < 480) {
+ m_capture->set(CV_CAP_PROP_FRAME_WIDTH, 640);
+ m_capture->set(CV_CAP_PROP_FRAME_HEIGHT, 480);
+ }
+ // Print actual values
+ std::cout << "Webcam frame properties: "
+ << m_capture->get(CV_CAP_PROP_FRAME_WIDTH) << "x"
+ << m_capture->get(CV_CAP_PROP_FRAME_HEIGHT) << std::endl;
+
// Initialize the video writer
#ifdef SAVE_WEBCAM_VIDEO
float fps = m_capture->get(CV_CAP_PROP_FPS);
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:50
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Mon Jul 16 21:16:44 2012 -0300
Fix ffmpeg related compilation issue.
---
game/ffmpeg.cc | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index e4440ed..501c7b6 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -12,6 +12,8 @@ extern "C" {
#include SWSCALE_INCLUDE
}
+#define SAMPLE_FMT_S16 AV_SAMPLE_FMT_S16
+
#define AUDIO_CHANNELS 2
/*static*/ boost::mutex FFmpeg::s_avcodec_mutex;
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:47
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Tue Jul 17 07:39:15 2012 -0300
Fix covers draw graphic issue on songs screen.
---
game/screen_songs.cc | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/game/screen_songs.cc b/game/screen_songs.cc
index afe23a1..0d56f26 100644
--- a/game/screen_songs.cc
+++ b/game/screen_songs.cc
@@ -202,8 +202,8 @@ void ScreenSongs::drawMultimedia() {
}
if (!m_jukebox) {
m_songbg_ground->draw();
- drawCovers();
theme->bg.draw();
+ drawCovers();
}
}
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:39
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Tue Jul 17 07:36:34 2012 -0300
Fix ffmpeg compile issue.
---
game/ffmpeg.cc | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index e4440ed..ac0889a 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -12,6 +12,10 @@ extern "C" {
#include SWSCALE_INCLUDE
}
+#if (LIBAVCODEC_VERSION_INT) < (AV_VERSION_INT(52,94,3))
+# define AV_SAMPLE_FMT_S16 SAMPLE_FMT_S16
+#endif
+
#define AUDIO_CHANNELS 2
/*static*/ boost::mutex FFmpeg::s_avcodec_mutex;
@@ -66,7 +70,7 @@ void FFmpeg::open() {
switch (m_mediaType) {
case AVMEDIA_TYPE_AUDIO:
- m_resampleContext = av_audio_resample_init(AUDIO_CHANNELS, cc->channels, m_rate, cc->sample_rate, SAMPLE_FMT_S16, SAMPLE_FMT_S16, 16, 10, 0, 0.8);
+ m_resampleContext = av_audio_resample_init(AUDIO_CHANNELS, cc->channels, m_rate, cc->sample_rate, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16, 16, 10, 0, 0.8);
if (!m_resampleContext) throw std::runtime_error("Cannot create resampling context");
audioQueue.setSamplesPerSecond(AUDIO_CHANNELS * m_rate);
break;
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:33
|
Author: Alvaro Fernando Garcia <alv...@gm...> Date: Tue Jul 10 00:11:48 2012 -0300 Merge branch 'master' into dance3d --- |
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:30
|
Author: Alvaro Fernando Garcia <alv...@gm...>
Date: Tue Jul 10 00:06:37 2012 -0300
Fix video playback issue in dance mode.
---
game/ffmpeg.cc | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index e4440ed..616384e 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -161,8 +161,8 @@ void FFmpeg::decodePacket() {
packetSize -= decodeSize; // Move forward within the packet
if (!frameFinished) continue;
// Update current position if timecode is available
- if (frame->pkt_pts != uint64_t(AV_NOPTS_VALUE)) {
- m_position = double(frame->pkt_pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
+ if (packet.pts != int64_t(AV_NOPTS_VALUE)) {
+ m_position = double(packet.pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
}
if (m_mediaType == AVMEDIA_TYPE_VIDEO) processVideo(frame); else processAudio(frame);
}
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:22
|
Author: Lasse Karkkainen <tro...@tr...>
Date: Sun Jul 8 11:38:55 2012 +0300
Fix indent: only blocks use tabs; line splitting and other things use only two spaces.
---
game/ffmpeg.cc | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index 1393760..e4440ed 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -155,8 +155,8 @@ void FFmpeg::decodePacket() {
AVFrameWrapper frame;
int frameFinished = 0;
int decodeSize = (m_mediaType == AVMEDIA_TYPE_VIDEO ?
- avcodec_decode_video2(m_codecContext, frame, &frameFinished, &packet) :
- avcodec_decode_audio4(m_codecContext, frame, &frameFinished, &packet));
+ avcodec_decode_video2(m_codecContext, frame, &frameFinished, &packet) :
+ avcodec_decode_audio4(m_codecContext, frame, &frameFinished, &packet));
if (decodeSize < 0) throw std::runtime_error("cannot decode avframe");
packetSize -= decodeSize; // Move forward within the packet
if (!frameFinished) continue;
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:15
|
Author: Alvaro Fernando García <alv...@gm...>
Date: Sun Jul 8 04:52:42 2012 -0300
Fixed ffmpeg.cc compilation error.
---
game/ffmpeg.cc | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index fae6e3d..1393760 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -154,7 +154,9 @@ void FFmpeg::decodePacket() {
if (packet.stream_index != m_streamId) return;
AVFrameWrapper frame;
int frameFinished = 0;
- int decodeSize = (m_mediaType == AVMEDIA_TYPE_VIDEO ? avcodec_decode_video2 : avcodec_decode_audio4)(m_codecContext, frame, &frameFinished, &packet);
+ int decodeSize = (m_mediaType == AVMEDIA_TYPE_VIDEO ?
+ avcodec_decode_video2(m_codecContext, frame, &frameFinished, &packet) :
+ avcodec_decode_audio4(m_codecContext, frame, &frameFinished, &packet));
if (decodeSize < 0) throw std::runtime_error("cannot decode avframe");
packetSize -= decodeSize; // Move forward within the packet
if (!frameFinished) continue;
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:12
|
Author: Lasse Karkkainen <tro...@tr...>
Date: Sun Jul 8 10:19:22 2012 +0300
Cleanup of duplicated code in class FFmpeg. Changes to timecode calculation should not affect behavior.
---
game/ffmpeg.cc | 114 ++++++++++++++++++++++++--------------------------------
game/ffmpeg.hh | 7 +--
2 files changed, 52 insertions(+), 69 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index 4578e08..fae6e3d 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -126,84 +126,68 @@ void FFmpeg::seek_internal() {
m_seekTarget = getNaN(); // Signal that seeking is done
}
-struct ReadFramePacket: public AVPacket {
- AVFormatContext* m_s;
- ReadFramePacket(AVFormatContext* s): m_s(s) {
- if (av_read_frame(s, this) < 0) throw FFmpeg::eof_error();
- }
- ~ReadFramePacket() { av_free_packet(this); }
-};
-
void FFmpeg::decodePacket() {
+ struct ReadFramePacket: public AVPacket {
+ AVFormatContext* m_s;
+ ReadFramePacket(AVFormatContext* s): m_s(s) {
+ if (av_read_frame(s, this) < 0) throw FFmpeg::eof_error();
+ }
+ ~ReadFramePacket() { av_free_packet(this); }
+ };
+
+ struct AVFrameWrapper {
+ AVFrame* m_frame;
+ AVFrameWrapper(): m_frame(avcodec_alloc_frame()) {
+ if (!m_frame) throw std::runtime_error("Unable to allocate AVFrame");
+ }
+ ~AVFrameWrapper() { av_free(m_frame); }
+ operator AVFrame*() { return m_frame; }
+ AVFrame* operator->() { return m_frame; }
+ };
+
+ // Read an AVPacket and decode it into AVFrames
ReadFramePacket packet(m_formatContext);
int packetSize = packet.size;
while (packetSize) {
if (packetSize < 0) throw std::logic_error("negative packet size?!");
if (m_quit || m_seekTarget == m_seekTarget) return;
if (packet.stream_index != m_streamId) return;
- int decodeSize = 0;
- if (m_mediaType == AVMEDIA_TYPE_VIDEO) decodeSize = decodeVideoFrame(packet);
- if (m_mediaType == AVMEDIA_TYPE_AUDIO) decodeSize = decodeAudioFrame(packet);
+ AVFrameWrapper frame;
+ int frameFinished = 0;
+ int decodeSize = (m_mediaType == AVMEDIA_TYPE_VIDEO ? avcodec_decode_video2 : avcodec_decode_audio4)(m_codecContext, frame, &frameFinished, &packet);
+ if (decodeSize < 0) throw std::runtime_error("cannot decode avframe");
packetSize -= decodeSize; // Move forward within the packet
+ if (!frameFinished) continue;
+ // Update current position if timecode is available
+ if (frame->pkt_pts != uint64_t(AV_NOPTS_VALUE)) {
+ m_position = double(frame->pkt_pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
+ }
+ if (m_mediaType == AVMEDIA_TYPE_VIDEO) processVideo(frame); else processAudio(frame);
}
}
-struct AVFrameWrapper {
- AVFrame* m_frame;
- AVFrameWrapper(): m_frame(avcodec_alloc_frame()) {
- if (!m_frame) throw std::runtime_error("Unable to allocate AVFrame");
- }
- ~AVFrameWrapper() { av_free(m_frame); }
- operator AVFrame*() { return m_frame; }
- AVFrame* operator->() { return m_frame; }
-};
-
-int FFmpeg::decodeVideoFrame(ReadFramePacket& packet) {
- struct AVFrameWrapper videoFrame;
-
- int frameFinished = 0;
- int decodeSize = avcodec_decode_video2(m_codecContext, videoFrame, &frameFinished, &packet);
- if (decodeSize < 0) throw std::runtime_error("cannot decode video frame");
- if (frameFinished) {
- // Convert into RGB and scale the data
- int w = (m_codecContext->width+15)&~15;
- int h = m_codecContext->height;
- std::vector<uint8_t> buffer(w * h * 3);
- {
- uint8_t* data = &buffer[0];
- int linesize = w * 3;
- sws_scale(m_swsContext, videoFrame->data, videoFrame->linesize, 0, h, &data, &linesize);
- }
- // Timecode calculation
- m_position = double(videoFrame->pkt_pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
- // Construct a new video frame and push it to output queue
- VideoFrame* tmp = new VideoFrame(m_position, w, h);
- tmp->data.swap(buffer);
- videoQueue.push(tmp); // Takes ownership and may block
+void FFmpeg::processVideo(AVFrame* frame) {
+ // Convert into RGB and scale the data
+ int w = (m_codecContext->width+15)&~15;
+ int h = m_codecContext->height;
+ std::vector<uint8_t> buffer(w * h * 3);
+ {
+ uint8_t* data = &buffer[0];
+ int linesize = w * 3;
+ sws_scale(m_swsContext, frame->data, frame->linesize, 0, h, &data, &linesize);
}
- return decodeSize;
+ // Construct a new video frame and push it to output queue
+ VideoFrame* tmp = new VideoFrame(m_position, w, h);
+ tmp->data.swap(buffer);
+ videoQueue.push(tmp); // Takes ownership and may block
}
-int FFmpeg::decodeAudioFrame(ReadFramePacket& packet) {
- struct AVFrameWrapper audioFrame;
-
- int gotFrame = 0;
- int decodeSize = avcodec_decode_audio4(m_codecContext, audioFrame, &gotFrame, &packet);
- if (decodeSize < 0) throw std::runtime_error("cannot decode audio frame");
- if (gotFrame) {
- std::vector<int16_t> resampled(AVCODEC_MAX_AUDIO_FRAME_SIZE);
- // Use number of samples from AVFrame
- int frames = audio_resample(m_resampleContext, &resampled[0], (short*)audioFrame->data[0], audioFrame->nb_samples);
- resampled.resize(frames * AUDIO_CHANNELS);
- // Use timecode from packet if available
- if (uint64_t(packet.pts) != uint64_t(AV_NOPTS_VALUE)) {
- m_position = double(packet.pts) * av_q2d(m_formatContext->streams[m_streamId]->time_base);
- }
- // Push to output queue (may block)
- audioQueue.push(resampled, m_position);
- // Increment current time
- m_position += double(resampled.size())/double(audioQueue.getSamplesPerSecond());
- }
- return decodeSize;
+void FFmpeg::processAudio(AVFrame* frame) {
+ // Resample to output sample rate, then push to audio queue and increment timecode
+ std::vector<int16_t> resampled(AVCODEC_MAX_AUDIO_FRAME_SIZE);
+ int frames = audio_resample(m_resampleContext, &resampled[0], (short*)frame->data[0], frame->nb_samples);
+ resampled.resize(frames * AUDIO_CHANNELS);
+ audioQueue.push(resampled, m_position); // May block
+ m_position += double(frames)/m_formatContext->streams[m_streamId]->codec->sample_rate;
}
diff --git a/game/ffmpeg.hh b/game/ffmpeg.hh
index 4d4619a..c7578ee 100644
--- a/game/ffmpeg.hh
+++ b/game/ffmpeg.hh
@@ -198,12 +198,11 @@ extern "C" {
struct AVCodec;
struct AVCodecContext;
struct AVFormatContext;
+ struct AVFrame;
struct ReSampleContext;
struct SwsContext;
}
-struct ReadFramePacket;
-
/// ffmpeg class
class FFmpeg {
public:
@@ -230,8 +229,8 @@ class FFmpeg {
void seek_internal();
void open();
void decodePacket();
- int decodeVideoFrame(ReadFramePacket& packet);
- int decodeAudioFrame(ReadFramePacket& packet);
+ void processVideo(AVFrame* frame);
+ void processAudio(AVFrame* frame);
std::string m_filename;
unsigned int m_rate;
volatile bool m_quit;
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:52:04
|
Author: Alvaro Fernando García <alv...@gm...> Date: Sun Jul 8 03:57:51 2012 -0300 Updated japanese translation. --- lang/ja.po | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lang/ja.po b/lang/ja.po index b2a299e..e62f8c9 100644 --- a/lang/ja.po +++ b/lang/ja.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Performous\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-08-01 22:10+0200\n" -"PO-Revision-Date: 2011-08-01 22:10+0200\n" -"Last-Translator: Tapio Vierros <tap...@gm...>\n" +"PO-Revision-Date: 2012-07-08 03:57-0300\n" +"Last-Translator: Alvaro Fernando García <alvarofernandogarcía@gmail.com>\n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" @@ -20,7 +20,7 @@ msgstr "" #: ../game/song.hh:36 msgid "Guitar" -msgstr "" +msgstr "ギタ−" #: ../game/song.hh:36 msgid "Coop guitar" @@ -28,19 +28,19 @@ msgstr "" #: ../game/song.hh:36 msgid "Rhythm guitar" -msgstr "" +msgstr "リズムギター" #: ../game/song.hh:36 msgid "Bass" -msgstr "" +msgstr "ベースギター" #: ../game/song.hh:36 msgid "Drums" -msgstr "" +msgstr "ドラム" #: ../game/song.hh:36 msgid "Vocals" -msgstr "" +msgstr "ボーカル" #: ../game/song.hh:36 msgid "Harmonic 1" @@ -76,7 +76,7 @@ msgstr "難しい" #: ../game/dancegraph.cc:18 msgid "Challenge" -msgstr "" +msgstr "挑戦" # There's probably a better word #: ../game/dancegraph.cc:111 @@ -152,6 +152,8 @@ msgid "" "God Mode\n" "Activated!" msgstr "" +"神モード\n" +"活性化!" #: ../game/guitargraph.cc:500 msgid "Mistakes ignored!" @@ -171,7 +173,7 @@ msgstr "" #: ../game/configuration.cc:116 msgid "Enabled" -msgstr "" +msgstr "使用可能" #: ../game/configuration.cc:116 msgid "Disabled" @@ -216,7 +218,7 @@ msgstr "演奏に再会する" #: ../game/screen_sing.cc:85 msgid "Restart" -msgstr "" +msgstr "再起動" #: ../game/screen_sing.cc:85 msgid "" |
|
From: rainbyte <rai...@us...> - 2012-07-17 10:51:58
|
Author: Alvaro Fernando García <alv...@gm...> Date: Sun Jul 8 03:38:48 2012 -0300 Updated spanish translation. --- lang/es.po | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lang/es.po b/lang/es.po index f86b65d..a417578 100644 --- a/lang/es.po +++ b/lang/es.po @@ -4,7 +4,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-08-01 22:09+0200\n" "PO-Revision-Date: \n" -"Last-Translator: Tapio Vierros <tap...@gm...>\n" +"Last-Translator: Alvaro Fernando García <alvarofernandogarcía@gmail.com>\n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" @@ -473,11 +473,11 @@ msgstr "" #: ../game/screen_intro.cc:64 msgid "Settings saved as system defaults." -msgstr "" +msgstr "Configuración guardada como predeterminada." #: ../game/screen_intro.cc:64 msgid "Settings saved." -msgstr "" +msgstr "Configuración guardada." #: ../game/screen_intro.cc:146 msgid "Ctrl + S to save, Ctrl + R to reset defaults" @@ -697,27 +697,29 @@ msgstr "Habilita el modo pantalla completa al iniciar la aplicación." #: /tmp/xml2gettext.kDjC6MN5nr:34 msgid "Stereoscopic 3D" -msgstr "" +msgstr "3D Esteroscópico" #: /tmp/xml2gettext.kDjC6MN5nr:35 msgid "Enable 3D rendering of Performous." -msgstr "" +msgstr "Habilitar renderizado 3D de Performous." #: /tmp/xml2gettext.kDjC6MN5nr:36 +#, fuzzy msgid "Stereo3D type" -msgstr "" +msgstr "Tipo de 3D Esteoscópico" #: /tmp/xml2gettext.kDjC6MN5nr:37 msgid "Some modes may only get activated in fullscreen mode." -msgstr "" +msgstr "Algunos modos pueden activarse solo en modo pantalla completa." #: /tmp/xml2gettext.kDjC6MN5nr:38 +#, fuzzy msgid "Stereo3D separation" -msgstr "" +msgstr "Separación de 3D Estereoscópico" #: /tmp/xml2gettext.kDjC6MN5nr:39 msgid "The strength of the effect. Experiment with different settings for best results." -msgstr "" +msgstr "Fuerza del efecto. Experimentar con diferentes configuraciones para mejores resultados." #: /tmp/xml2gettext.kDjC6MN5nr:40 msgid "Video playback" |
|
From: rainbyte <rai...@us...> - 2012-07-17 10:51:50
|
Author: Alvaro Fernando García <alv...@gm...> Date: Sun Jul 8 01:32:06 2012 -0300 Merge branch 'master' of git://git.performous.org/gitroot/performous/performous --- |
|
From: rainbyte <rai...@us...> - 2012-07-17 10:51:47
|
Author: Alvaro Fernando García <alv...@gm...>
Date: Sun Jul 8 01:11:47 2012 -0300
Update to use avcodec_decode_audio4 (fix avcodec_decode_audio3 deprecated warning)
---
game/ffmpeg.cc | 45 ++++++++++++++++++---------------------------
1 files changed, 18 insertions(+), 27 deletions(-)
diff --git a/game/ffmpeg.cc b/game/ffmpeg.cc
index 1b9d874..4578e08 100644
--- a/game/ffmpeg.cc
+++ b/game/ffmpeg.cc
@@ -148,16 +148,18 @@ void FFmpeg::decodePacket() {
}
}
+struct AVFrameWrapper {
+ AVFrame* m_frame;
+ AVFrameWrapper(): m_frame(avcodec_alloc_frame()) {
+ if (!m_frame) throw std::runtime_error("Unable to allocate AVFrame");
+ }
+ ~AVFrameWrapper() { av_free(m_frame); }
+ operator AVFrame*() { return m_frame; }
+ AVFrame* operator->() { return m_frame; }
+};
+
int FFmpeg::decodeVideoFrame(ReadFramePacket& packet) {
- struct AVFrameWrapper {
- AVFrame* m_frame;
- AVFrameWrapper(): m_frame(avcodec_alloc_frame()) {
- if (!m_frame) throw std::runtime_error("Unable to allocate AVFrame");
- }
- ~AVFrameWrapper() { av_free(m_frame); }
- operator AVFrame*() { return m_frame; }
- AVFrame* operator->() { return m_frame; }
- } videoFrame;
+ struct AVFrameWrapper videoFrame;
int frameFinished = 0;
int decodeSize = avcodec_decode_video2(m_codecContext, videoFrame, &frameFinished, &packet);
@@ -183,26 +185,15 @@ int FFmpeg::decodeVideoFrame(ReadFramePacket& packet) {
}
int FFmpeg::decodeAudioFrame(ReadFramePacket& packet) {
- class AudioBuffer {
- public:
- AudioBuffer(size_t _size): m_buffer((int16_t*)av_malloc(_size*sizeof(int16_t))) {
- if (!m_buffer) throw std::runtime_error("Unable to allocate AudioBuffer");
- }
- ~AudioBuffer() { av_free(m_buffer); }
- operator int16_t*() { return m_buffer; }
- int16_t* operator->() { return m_buffer; }
- private:
- int16_t* m_buffer;
- } audioFrames(AVCODEC_MAX_AUDIO_FRAME_SIZE);
-
- int outsize = AVCODEC_MAX_AUDIO_FRAME_SIZE*sizeof(int16_t);
- int decodeSize = avcodec_decode_audio3(m_codecContext, audioFrames, &outsize, &packet);
+ struct AVFrameWrapper audioFrame;
+
+ int gotFrame = 0;
+ int decodeSize = avcodec_decode_audio4(m_codecContext, audioFrame, &gotFrame, &packet);
if (decodeSize < 0) throw std::runtime_error("cannot decode audio frame");
- if (outsize > 0) {
- // Convert outsize from bytes into number of frames (samples)
- outsize /= sizeof(int16_t) * m_codecContext->channels;
+ if (gotFrame) {
std::vector<int16_t> resampled(AVCODEC_MAX_AUDIO_FRAME_SIZE);
- int frames = audio_resample(m_resampleContext, &resampled[0], audioFrames, outsize);
+ // Use number of samples from AVFrame
+ int frames = audio_resample(m_resampleContext, &resampled[0], (short*)audioFrame->data[0], audioFrame->nb_samples);
resampled.resize(frames * AUDIO_CHANNELS);
// Use timecode from packet if available
if (uint64_t(packet.pts) != uint64_t(AV_NOPTS_VALUE)) {
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:51:39
|
Author: Alvaro Fernando García <alv...@gm...>
Date: Sat Jul 7 18:53:56 2012 -0300
Fixed boost xtime.hpp usage (for 1.50 version)
---
game/xtime.hh | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/game/xtime.hh b/game/xtime.hh
index 41303cb..8f5463d 100644
--- a/game/xtime.hh
+++ b/game/xtime.hh
@@ -1,5 +1,6 @@
#pragma once
+#include <boost/version.hpp>
#include <boost/thread/xtime.hpp>
#include <cmath>
@@ -20,7 +21,11 @@ namespace {
}
boost::xtime now() {
boost::xtime time;
+#if (BOOST_VERSION / 100 % 1000 >= 50)
+ boost::xtime_get(&time, boost::TIME_UTC_);
+#else
boost::xtime_get(&time, boost::TIME_UTC);
+#endif
return time;
}
double seconds(boost::xtime const& time) {
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:51:32
|
Author: Lasse Karkkainen <tro...@tr...>
Date: Sat Jul 7 08:16:42 2012 +0300
Make video fade use premultiplied alpha.
---
game/video.cc | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/game/video.cc b/game/video.cc
index 7adca6a..db4812a 100644
--- a/game/video.cc
+++ b/game/video.cc
@@ -34,7 +34,7 @@ void Video::render(double time) {
if (alpha > 0.0f) {
Color color;
if (alpha < 1.0f) {
- color = Color(1.0f, 1.0f, 1.0f, alpha);
+ color = Color(alpha, alpha, alpha, alpha);
} else {
color = Color(1.0f, 1.0f, 1.0f);
}
|
|
From: rainbyte <rai...@us...> - 2012-07-17 10:51:22
|
Author: Alvaro Fernando García <alv...@gm...> Date: Fri Jul 6 18:56:52 2012 -0300 Fixed glib.h compilation error. --- game/unicode.cc | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/game/unicode.cc b/game/unicode.cc index 0afd382..959b400 100644 --- a/game/unicode.cc +++ b/game/unicode.cc @@ -3,7 +3,7 @@ #include <boost/scoped_ptr.hpp> #include <glibmm/ustring.h> -#include <glib/gconvert.h> +#include <glib.h> #include <sstream> #include <stdexcept> |