add .opus support

This commit is contained in:
Crystalwarrior 2019-11-04 16:10:54 +03:00
parent 963e321095
commit a49c4a503b
8 changed files with 70 additions and 5 deletions

View File

@ -13,7 +13,6 @@ MOC_DIR = $$PWD/build
SOURCES += $$files($$PWD/src/*.cpp)
HEADERS += $$files($$PWD/include/*.h)
LIBS += -L$$PWD/lib
DEFINES += DISCORD
@ -26,6 +25,7 @@ DEFINES += BASSAUDIO
contains(DEFINES, BASSAUDIO) {
LIBS += -lbass
LIBS += -lbassopus
}
#DEFINES += QTAUDIO

View File

@ -3,6 +3,7 @@
#if defined(BASSAUDIO)
#include "bass.h"
#include "bassopus.h"
#elif defined(QTAUDIO)
#include <QSoundEffect>
#endif

View File

@ -4,6 +4,7 @@
#if defined(BASSAUDIO)
#include "bass.h"
#include "bassopus.h"
#elif defined(QTAUDIO)
#include <QMediaPlayer>
#endif

View File

@ -3,6 +3,7 @@
#if defined(BASSAUDIO)
#include "bass.h"
#include "bassopus.h"
#elif defined(QTAUDIO)
#include <QSoundEffect>
#endif

52
include/bassopus.h Normal file
View File

@ -0,0 +1,52 @@
/*
BASSOPUS 2.4 C/C++ header file
Copyright (c) 2012-2015 Un4seen Developments Ltd.
See the BASSOPUS.CHM file for more detailed documentation
*/
#ifndef BASSOPUS_H
#define BASSOPUS_H
#include "bass.h"
#if BASSVERSION!=0x204
#error conflicting BASS and BASSOPUS versions
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifndef BASSOPUSDEF
#define BASSOPUSDEF(f) WINAPI f
#endif
// BASS_CHANNELINFO type
#define BASS_CTYPE_STREAM_OPUS 0x11200
// Additional attributes
#define BASS_ATTRIB_OPUS_ORIGFREQ 0x13000
#define BASS_ATTRIB_OPUS_GAIN 0x13001
HSTREAM BASSOPUSDEF(BASS_OPUS_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags);
HSTREAM BASSOPUSDEF(BASS_OPUS_StreamCreateURL)(const char *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user);
HSTREAM BASSOPUSDEF(BASS_OPUS_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *procs, void *user);
#ifdef __cplusplus
}
#if defined(_WIN32) && !defined(NOBASSOVERLOADS)
static inline HSTREAM BASS_OPUS_StreamCreateFile(BOOL mem, const WCHAR *file, QWORD offset, QWORD length, DWORD flags)
{
return BASS_OPUS_StreamCreateFile(mem, (const void*)file, offset, length, flags|BASS_UNICODE);
}
static inline HSTREAM BASS_OPUS_StreamCreateURL(const WCHAR *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user)
{
return BASS_OPUS_StreamCreateURL((const char*)url, offset, flags|BASS_UNICODE, proc, user);
}
#endif
#endif
#endif

View File

@ -15,7 +15,10 @@ void AOBlipPlayer::set_blips(QString p_sfx)
{
BASS_StreamFree(m_stream_list[n_stream]);
m_stream_list[n_stream] = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_UNICODE | BASS_ASYNCFILE);
if (f_path.endsWith(".opus"))
m_stream_list[n_stream] = BASS_OPUS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_UNICODE | BASS_ASYNCFILE);
else
m_stream_list[n_stream] = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_UNICODE | BASS_ASYNCFILE);
}
set_volume_internal(m_volume);
@ -46,7 +49,7 @@ void AOBlipPlayer::set_volume(qreal p_value)
void AOBlipPlayer::set_volume_internal(qreal p_value)
{
float volume = p_value;
float volume = static_cast<float>(p_value);
for (int n_stream = 0 ; n_stream < 5 ; ++n_stream)
{

View File

@ -26,7 +26,11 @@ void AOMusicPlayer::play(QString p_song, int channel, bool loop, int effect_flag
if (loop)
flags |= BASS_SAMPLE_LOOP;
DWORD newstream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, flags);
DWORD newstream;
if (f_path.endsWith(".opus"))
newstream = BASS_OPUS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, flags);
else
newstream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, flags);
if (ao_app->get_audio_output_device() != "default")
BASS_ChannelSetDevice(m_stream_list[channel], BASS_GetDevice());

View File

@ -59,7 +59,10 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout, int channel
if (!file_exists(f_path))
f_path = ao_app->get_sfx_suffix(f_path); //If we're not given a sound file with .wav/.ogg/.opus already there, let's do this thing
m_stream_list[channel] = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
if (f_path.endsWith(".opus"))
m_stream_list[channel] = BASS_OPUS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
else
m_stream_list[channel] = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
set_volume_internal(m_volume);