Skip to content

Commit 9d5d395

Browse files
committed
fix #311621: fixed export audio on Windows
1 parent 9c41e34 commit 9d5d395

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

mscore/exportaudio.cpp

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,18 @@
1717
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1818
//=============================================================================
1919

20-
#include <QFile>
21-
2220
#include "config.h"
21+
22+
#ifdef Q_OS_WIN
23+
#define WIN32_LEAN_AND_MEAN
24+
#include <windows.h>
25+
#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
26+
#endif
27+
2328
#ifdef HAS_AUDIOFILE
2429
#include <sndfile.h>
2530
#endif
31+
2632
#include "libmscore/score.h"
2733
#include "libmscore/note.h"
2834
#include "libmscore/part.h"
@@ -225,7 +231,6 @@ bool MuseScore::saveAudio(Score* score, const QString& name)
225231
SF_INFO info;
226232
SNDFILE *sf = nullptr;
227233
const QString filename;
228-
QFile file;
229234
public:
230235
SoundFileDevice(int sampleRate, int format, const QString& name)
231236
: filename(name) {
@@ -258,23 +263,33 @@ bool MuseScore::saveAudio(Score* score, const QString& name)
258263
return false;
259264
}
260265

261-
file.setFileName(filename);
262-
if (!file.open(mode)) {
263-
return false;
266+
#ifdef Q_OS_WIN
267+
#define SF_FILENAME_LEN 1024
268+
QByteArray path = filename.toUtf8();
269+
wchar_t wpath[SF_FILENAME_LEN];
270+
int dwRet = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path.constData(), -1, wpath, SF_FILENAME_LEN);
271+
if (dwRet == 0) {
272+
qCritical() << Q_FUNC_INFO << "filed get path: " << GetLastError() << "\n";
273+
return false;
264274
}
265-
sf = sf_open_fd(file.handle(), SFM_WRITE, &info, false);
275+
sf = sf_wchar_open(wpath, SFM_WRITE, &info);
276+
#else // Q_OS_WIN
277+
sf = sf_open(qPrintable(filename), SFM_WRITE, &info);
278+
#endif // Q_OS_WIN
279+
266280
if (sf == nullptr) {
267281
qDebug("open soundfile failed: %s", sf_strerror(sf));
268282
return false;
269-
}
283+
}
284+
270285
return QIODevice::open(mode);
271286
}
272287
void close() {
273288
if (sf && sf_close(sf)) {
274289
qDebug("close soundfile failed");
275290
}
291+
276292
sf = nullptr;
277-
file.close();
278293
QIODevice::close();
279294
}
280295
};

0 commit comments

Comments
 (0)