|
17 | 17 | // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
18 | 18 | //============================================================================= |
19 | 19 |
|
20 | | -#include <QFile> |
21 | | - |
22 | 20 | #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 | + |
23 | 28 | #ifdef HAS_AUDIOFILE |
24 | 29 | #include <sndfile.h> |
25 | 30 | #endif |
| 31 | + |
26 | 32 | #include "libmscore/score.h" |
27 | 33 | #include "libmscore/note.h" |
28 | 34 | #include "libmscore/part.h" |
@@ -225,7 +231,6 @@ bool MuseScore::saveAudio(Score* score, const QString& name) |
225 | 231 | SF_INFO info; |
226 | 232 | SNDFILE *sf = nullptr; |
227 | 233 | const QString filename; |
228 | | - QFile file; |
229 | 234 | public: |
230 | 235 | SoundFileDevice(int sampleRate, int format, const QString& name) |
231 | 236 | : filename(name) { |
@@ -258,23 +263,33 @@ bool MuseScore::saveAudio(Score* score, const QString& name) |
258 | 263 | return false; |
259 | 264 | } |
260 | 265 |
|
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; |
264 | 274 | } |
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 | + |
266 | 280 | if (sf == nullptr) { |
267 | 281 | qDebug("open soundfile failed: %s", sf_strerror(sf)); |
268 | 282 | return false; |
269 | | - } |
| 283 | + } |
| 284 | + |
270 | 285 | return QIODevice::open(mode); |
271 | 286 | } |
272 | 287 | void close() { |
273 | 288 | if (sf && sf_close(sf)) { |
274 | 289 | qDebug("close soundfile failed"); |
275 | 290 | } |
| 291 | + |
276 | 292 | sf = nullptr; |
277 | | - file.close(); |
278 | 293 | QIODevice::close(); |
279 | 294 | } |
280 | 295 | }; |
|
0 commit comments