mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
Add support for native FLAC reading
This commit is contained in:
parent
5feecd2243
commit
1c6f4c29c4
@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
#include "config_movies.h"
|
#include "config_movies.h"
|
||||||
#include "dconfig.h"
|
#include "dconfig.h"
|
||||||
|
#include "flacAudio.h"
|
||||||
|
#include "flacAudioCursor.h"
|
||||||
#include "inkblotVideo.h"
|
#include "inkblotVideo.h"
|
||||||
#include "inkblotVideoCursor.h"
|
#include "inkblotVideoCursor.h"
|
||||||
#include "microphoneAudio.h"
|
#include "microphoneAudio.h"
|
||||||
@ -75,6 +77,8 @@ init_libmovies() {
|
|||||||
}
|
}
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
||||||
|
FlacAudio::init_type();
|
||||||
|
FlacAudioCursor::init_type();
|
||||||
InkblotVideo::init_type();
|
InkblotVideo::init_type();
|
||||||
InkblotVideoCursor::init_type();
|
InkblotVideoCursor::init_type();
|
||||||
MicrophoneAudio::init_type();
|
MicrophoneAudio::init_type();
|
||||||
@ -93,6 +97,7 @@ init_libmovies() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
MovieTypeRegistry *reg = MovieTypeRegistry::get_global_ptr();
|
MovieTypeRegistry *reg = MovieTypeRegistry::get_global_ptr();
|
||||||
|
reg->register_audio_type(&FlacAudio::make, "flac");
|
||||||
reg->register_audio_type(&WavAudio::make, "wav wave");
|
reg->register_audio_type(&WavAudio::make, "wav wave");
|
||||||
|
|
||||||
#ifdef HAVE_VORBIS
|
#ifdef HAVE_VORBIS
|
||||||
|
2976
panda/src/movies/dr_flac.h
Normal file
2976
panda/src/movies/dr_flac.h
Normal file
File diff suppressed because it is too large
Load Diff
12
panda/src/movies/flacAudio.I
Normal file
12
panda/src/movies/flacAudio.I
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file flacAudio.I
|
||||||
|
* @author rdb
|
||||||
|
* @date 2016-04-27
|
||||||
|
*/
|
64
panda/src/movies/flacAudio.cxx
Normal file
64
panda/src/movies/flacAudio.cxx
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file flacAudio.cxx
|
||||||
|
* @author rdb
|
||||||
|
* @date 2016-04-27
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "flacAudio.h"
|
||||||
|
#include "flacAudioCursor.h"
|
||||||
|
#include "virtualFileSystem.h"
|
||||||
|
#include "dcast.h"
|
||||||
|
|
||||||
|
TypeHandle FlacAudio::_type_handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xxx
|
||||||
|
*/
|
||||||
|
FlacAudio::
|
||||||
|
FlacAudio(const Filename &name) :
|
||||||
|
MovieAudio(name)
|
||||||
|
{
|
||||||
|
_filename = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xxx
|
||||||
|
*/
|
||||||
|
FlacAudio::
|
||||||
|
~FlacAudio() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open this audio, returning a MovieAudioCursor
|
||||||
|
*/
|
||||||
|
PT(MovieAudioCursor) FlacAudio::
|
||||||
|
open() {
|
||||||
|
VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
|
||||||
|
istream *stream = vfs->open_read_file(_filename, true);
|
||||||
|
|
||||||
|
if (stream == NULL) {
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
PT(FlacAudioCursor) cursor = new FlacAudioCursor(this, stream);
|
||||||
|
if (cursor == NULL || !cursor->_is_valid) {
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
return DCAST(MovieAudioCursor, cursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains a MovieAudio that references a file.
|
||||||
|
*/
|
||||||
|
PT(MovieAudio) FlacAudio::
|
||||||
|
make(const Filename &name) {
|
||||||
|
return DCAST(MovieAudio, new FlacAudio(name));
|
||||||
|
}
|
54
panda/src/movies/flacAudio.h
Normal file
54
panda/src/movies/flacAudio.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file flacAudio.h
|
||||||
|
* @author rdb
|
||||||
|
* @date 2016-04-27
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLACAUDIO_H
|
||||||
|
#define FLACAUDIO_H
|
||||||
|
|
||||||
|
#include "pandabase.h"
|
||||||
|
#include "movieAudio.h"
|
||||||
|
|
||||||
|
class FlacAudioCursor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads FLAC audio files. Ogg-encapsulated FLAC files are not supported.
|
||||||
|
*/
|
||||||
|
class EXPCL_PANDA_MOVIES FlacAudio : public MovieAudio {
|
||||||
|
PUBLISHED:
|
||||||
|
FlacAudio(const Filename &name);
|
||||||
|
virtual ~FlacAudio();
|
||||||
|
virtual PT(MovieAudioCursor) open();
|
||||||
|
|
||||||
|
static PT(MovieAudio) make(const Filename &name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class FlacAudioCursor;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TypeHandle get_class_type() {
|
||||||
|
return _type_handle;
|
||||||
|
}
|
||||||
|
static void init_type() {
|
||||||
|
MovieAudio::init_type();
|
||||||
|
register_type(_type_handle, "FlacAudio",
|
||||||
|
MovieAudio::get_class_type());
|
||||||
|
}
|
||||||
|
virtual TypeHandle get_type() const {
|
||||||
|
return get_class_type();
|
||||||
|
}
|
||||||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static TypeHandle _type_handle;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FLACAUDIO_H
|
12
panda/src/movies/flacAudioCursor.I
Normal file
12
panda/src/movies/flacAudioCursor.I
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file vorbisAudioCursor.I
|
||||||
|
* @author rdb
|
||||||
|
* @date 2013-08-23
|
||||||
|
*/
|
120
panda/src/movies/flacAudioCursor.cxx
Normal file
120
panda/src/movies/flacAudioCursor.cxx
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file flacAudioCursor.cxx
|
||||||
|
* @author rdb
|
||||||
|
* @date 2013-08-23
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "flacAudioCursor.h"
|
||||||
|
#include "virtualFileSystem.h"
|
||||||
|
|
||||||
|
#define DR_FLAC_IMPLEMENTATION
|
||||||
|
#define DR_FLAC_NO_STDIO
|
||||||
|
extern "C" {
|
||||||
|
#include "dr_flac.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback passed to dr_flac to implement file I/O via the VirtualFileSystem.
|
||||||
|
*/
|
||||||
|
static size_t cb_read_proc(void *user, void *buffer, size_t size) {
|
||||||
|
istream *stream = (istream *)user;
|
||||||
|
nassertr(stream != NULL, false);
|
||||||
|
|
||||||
|
stream->read((char *)buffer, size);
|
||||||
|
|
||||||
|
if (stream->eof()) {
|
||||||
|
// Gracefully handle EOF.
|
||||||
|
stream->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream->gcount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback passed to dr_flac to implement file I/O via the VirtualFileSystem.
|
||||||
|
*/
|
||||||
|
static bool cb_seek_proc(void *user, int offset) {
|
||||||
|
istream *stream = (istream *)user;
|
||||||
|
nassertr(stream != NULL, false);
|
||||||
|
|
||||||
|
stream->seekg(offset, ios::cur);
|
||||||
|
return !stream->fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
TypeHandle FlacAudioCursor::_type_handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads the .wav header from the indicated stream. This leaves the read
|
||||||
|
* pointer positioned at the start of the data.
|
||||||
|
*/
|
||||||
|
FlacAudioCursor::
|
||||||
|
FlacAudioCursor(FlacAudio *src, istream *stream) :
|
||||||
|
MovieAudioCursor(src),
|
||||||
|
_is_valid(false),
|
||||||
|
_drflac(NULL)
|
||||||
|
{
|
||||||
|
nassertv(stream != NULL);
|
||||||
|
nassertv(stream->good());
|
||||||
|
|
||||||
|
_drflac = drflac_open(&cb_read_proc, &cb_seek_proc, (void *)stream);
|
||||||
|
|
||||||
|
if (_drflac == NULL) {
|
||||||
|
movies_cat.error()
|
||||||
|
<< "Failed to open FLAC file.\n";
|
||||||
|
_is_valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_length = (_drflac->totalSampleCount / _drflac->channels) / (double)_drflac->sampleRate;
|
||||||
|
|
||||||
|
_audio_channels = _drflac->channels;
|
||||||
|
_audio_rate = _drflac->sampleRate;
|
||||||
|
|
||||||
|
_can_seek = true;
|
||||||
|
_can_seek_fast = _can_seek;
|
||||||
|
|
||||||
|
_is_valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xxx
|
||||||
|
*/
|
||||||
|
FlacAudioCursor::
|
||||||
|
~FlacAudioCursor() {
|
||||||
|
if (_drflac != NULL) {
|
||||||
|
drflac_close(_drflac);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seeks to a target location. Afterward, the packet_time is guaranteed to be
|
||||||
|
* less than or equal to the specified time.
|
||||||
|
*/
|
||||||
|
void FlacAudioCursor::
|
||||||
|
seek(double t) {
|
||||||
|
t = max(t, 0.0);
|
||||||
|
|
||||||
|
uint64_t sample = t * _drflac->sampleRate;
|
||||||
|
|
||||||
|
if (drflac_seek_to_sample(_drflac, sample * _drflac->channels)) {
|
||||||
|
_last_seek = sample / (double)_drflac->sampleRate;
|
||||||
|
_samples_read = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read audio samples from the stream. N is the number of samples you wish to
|
||||||
|
* read. Your buffer must be equal in size to N * channels. Multiple-channel
|
||||||
|
* audio will be interleaved.
|
||||||
|
*/
|
||||||
|
void FlacAudioCursor::
|
||||||
|
read_samples(int n, PN_int16 *data) {
|
||||||
|
int desired = n * _audio_channels;
|
||||||
|
_samples_read += drflac_read_s16(_drflac, desired, data) / _audio_channels;
|
||||||
|
}
|
65
panda/src/movies/flacAudioCursor.h
Normal file
65
panda/src/movies/flacAudioCursor.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file flacAudioCursor.h
|
||||||
|
* @author rdb
|
||||||
|
* @date 2013-08-23
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLACAUDIOCURSOR_H
|
||||||
|
#define FLACAUDIOCURSOR_H
|
||||||
|
|
||||||
|
#include "pandabase.h"
|
||||||
|
#include "movieAudioCursor.h"
|
||||||
|
|
||||||
|
#define DR_FLAC_NO_STDIO
|
||||||
|
extern "C" {
|
||||||
|
#include "dr_flac.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
class FlacAudio;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interfaces with the libvorbisfile library to implement decoding of Ogg
|
||||||
|
* Vorbis audio files.
|
||||||
|
*/
|
||||||
|
class EXPCL_PANDA_MOVIES FlacAudioCursor : public MovieAudioCursor {
|
||||||
|
PUBLISHED:
|
||||||
|
FlacAudioCursor(FlacAudio *src, istream *stream);
|
||||||
|
virtual ~FlacAudioCursor();
|
||||||
|
virtual void seek(double offset);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void read_samples(int n, PN_int16 *data);
|
||||||
|
|
||||||
|
bool _is_valid;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
drflac *_drflac;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TypeHandle get_class_type() {
|
||||||
|
return _type_handle;
|
||||||
|
}
|
||||||
|
static void init_type() {
|
||||||
|
MovieAudioCursor::init_type();
|
||||||
|
register_type(_type_handle, "FlacAudioCursor",
|
||||||
|
MovieAudioCursor::get_class_type());
|
||||||
|
}
|
||||||
|
virtual TypeHandle get_type() const {
|
||||||
|
return get_class_type();
|
||||||
|
}
|
||||||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static TypeHandle _type_handle;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "flacAudioCursor.I"
|
||||||
|
|
||||||
|
#endif // FLACAUDIOCURSOR_H
|
@ -1,4 +1,6 @@
|
|||||||
#include "config_movies.cxx"
|
#include "config_movies.cxx"
|
||||||
|
#include "flacAudio.cxx"
|
||||||
|
#include "flacAudioCursor.cxx"
|
||||||
#include "inkblotVideo.cxx"
|
#include "inkblotVideo.cxx"
|
||||||
#include "inkblotVideoCursor.cxx"
|
#include "inkblotVideoCursor.cxx"
|
||||||
#include "microphoneAudio.cxx"
|
#include "microphoneAudio.cxx"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user