Я пытаюсь воспроизвести аудиофайл .mod в исполняемом файле. Я использую сторонний BASSMOD .dll. Я могу заставить звуковой файл играть, когда я предоставляю полный путь к файлу, но я не могу заставить его играть, когда вы предоставляете относительный путь. Вот некоторые фрагменты.C++ char * относительный путь к файлу? (Qt)
main.cpp
#include <QCoreApplication>
#include "bassmod.h"
// define file location
const char* file = "C:/Users/Downloads/test4/console/music.mod";
void startMusic() {
BASSMOD_Init(-1, 44100, 0);
BASSMOD_MusicLoad(FALSE,(void*)file,0,0,BASS_MUSIC_RAMPS);
BASSMOD_MusicPlayEx(0,-1,TRUE);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
startMusic();
return a.exec();
}
bassmod.h (отношение сниппет)
BOOL BASSDEF(BASSMOD_MusicLoad)(BOOL mem, void* file, DWORD offset, DWORD length, DWORD flags);
Функция Я беспокоит BASSMOD_MusicLoad
. Поскольку этот проект стоит, файл .mod не будет работать. Однако, когда я пытаюсь изменить абсолютный путь файла .mod на относительный путь («music.mod»), файл не воспроизводится. Почему это? У меня есть файл .mod в том же каталоге, что и исполняемый файл, а также в каталоге, содержащем файл .pro, что, похоже, не было проблемой.
Кроме того, может быть, я пропустил что-то, связанное с тем, как файлы открываются в C++. Похоже, функция MusicLoad
требует, чтобы второй параметр имел тип void*
. Я уверен, что здесь есть много разных вещей. В идеале я хотел бы иметь file
хранить относительный путь к файлу .mod и заставить его играть так, поэтому мне не нужно жестко кодировать абсолютный путь. В идеальном мире я хотел бы предоставить file
путь к файлу .mod в моем resource.qrc, но тогда мне придется использовать QFile
, я считаю, что это не сработает, потому что мне нужен тип, который будет недействительным *.
Любая помощь для новичков будет оценена по достоинству.
EDIT 01: Спасибо всем за помощь! Я получил его на работу (по крайней мере, используя относительный путь к файлу). Есть два способа сделать это. Вот что я сделал и как я его протестировал:
Первый случай делает предположение, что BASSMOD (или любая внешняя dll, которую вы используете) не обрабатывает относительные пути.
const char* file = "C:/debug/music.mod"; // same dir as .exe
QFileInfo info("music.mod");
QString path = info.absoluteFilePath();
const string& tmp = path.toStdString();
const char* raw = tmp.data();
Это те элементы, которые я поставил. Когда я запускаю BASSMOD_MusicLoad(FALSE,(void*)file,0,0,BASS_MUSIC_RAMPS);
, он работает так, как ожидалось. Вот когда я жестко программирую полный абсолютный путь.
Когда я побежал BASSMOD_MusicLoad(FALSE,(void*)raw,0,0,BASS_MUSIC_RAMPS);
, он не сработал. Поэтому я решил напечатать значения для всего, чтобы увидеть, где это Мессинг:
cout << "Qstring path: ";
qDebug() << path;
cout << "string& tmp: ";
cout << tmp << endl;
cout << "raw: ";
cout << raw << endl;
cout << "full char* file: ";
cout << file;
startMusic();
... возвращает это:
Qstring path:
"C:/myApp/build-Debug/music.mod"
string& tmp:
C:/myApp/build-Debug/music.mod
raw:
C:/myApp/build-Debug/music.mod
full char* file:
C:/myApp/build-Debug/debug/music.mod
Обратите внимание на разницу? Когда я жестко закодировал полный путь к файлу, я обнаружил, что (благодаря @FrankOsterfeld и @JasonC) текущий рабочий каталог на самом деле не был там, где были найдены файлы .exe (/ debug) или .pro. Это было фактически в том же каталоге, что и Makefile.
Так что я просто изменил его на это: QFileInfo info("./debug/x.m");
и он сработал.
Несмотря на то, что проблема была связана с тем, что я не знал, где находится текущий рабочий каталог, решения @Radek, @SaZ и @JasonC помогли найти другой способ решить эту проблему (плюс это показало мне, как получить рабочие каналы и конвертировать между типами). Это хорошая рекомендация для людей, которые хотели бы использовать QFileInfo для определения того, где вы на самом деле находитесь в файловой системе. Я бы использовал это решение, если бы я использовал DLL, хорошо не обрабатывал относительные пути. Однако ...
Я задавался вопросом, могу ли я применить одно и то же решение к моему исходному коду (без использования QFileInfo и типов конвертирования и т. Д.). Я предположил, что BASSMOD не обрабатывал относительные пути из коробки. Я был неправ. Я изменил переменную file
на const char* file = "./debug/x.m";
Это сработало!
Спасибо за помощь, всем!
Однако, я все равно хотел бы, чтобы это работало с использованием music.mod из файла ресурсов Qt. Исходя из ответов, однако, похоже, что это возможно, если только сторонняя библиотека, которую вы используете, не поддерживает систему ресурсов Qt.
Какой код ошибки возвращает BASSMOD_MusicLoad? –
Чтобы получить это, я бы просто положил 'cout << BASSMOD_ErrorGetCode();' под строку 'BASSMOD_MusicLoad'?Когда я это делаю, он просто возвращает «2» в stdout. EDIT: nevermind. Я нашел код ошибки в файле заголовка. «2» - '#define BASS_ERROR_FILEOPEN // не могу открыть файл' – orbit
Так что он явно не может найти файл. Я предполагаю, что это имеет какое-то отношение к тому, как BASSMOD читает файл. Так как это скомпилированная .dll, к сожалению, это немного черный ящик. – orbit