summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-05-16 13:59:53 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-05-16 13:59:53 +0000
commitdbe4e49033aca03faf90c4678dc6a5f187584fb7 (patch)
treec3989c750880f62f11321c4f8ed62d661a0e0ad8
parent83058ab95bc1eab72235a10c5fa4125b51929d5e (diff)
downloadmpv-dbe4e49033aca03faf90c4678dc6a5f187584fb7.tar.bz2
mpv-dbe4e49033aca03faf90c4678dc6a5f187584fb7.tar.xz
Add a hack to detect when we are writing into a Windows pipe since the fseek
incorrectly does not fail like it should. This ensures we will not incorrectly append the file header at the end. Based on patch by Zhou Zongyi [zhouzongyi at pset.suntec.net] git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29311 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--libao2/ao_pcm.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libao2/ao_pcm.c b/libao2/ao_pcm.c
index 3379caf41f..a49a963a30 100644
--- a/libao2/ao_pcm.c
+++ b/libao2/ao_pcm.c
@@ -34,6 +34,10 @@
#include "mp_msg.h"
#include "help_mp.h"
+#ifdef __MINGW32__
+// for GetFileType to detect pipes
+#include <windows.h>
+#endif
static const ao_info_t info =
{
@@ -175,7 +179,13 @@ static int init(int rate,int channels,int format,int flags){
static void uninit(int immed){
if(ao_pcm_waveheader){ /* Rewrite wave header */
- if (fseek(fp, 0, SEEK_SET) != 0)
+ int broken_seek = 0;
+#ifdef __MINGW32__
+ // Windows, in its usual idiocy "emulates" seeks on pipes so it always looks
+ // like they work. So we have to detect them brute-force.
+ broken_seek = GetFileType((HANDLE)_get_osfhandle(_fileno(fp))) != FILE_TYPE_DISK;
+#endif
+ if (broken_seek || fseek(fp, 0, SEEK_SET) != 0)
mp_msg(MSGT_AO, MSGL_ERR, "Could not seek to start, WAV size headers not updated!\n");
else if (data_length > 0x7ffff000)
mp_msg(MSGT_AO, MSGL_ERR, "File larger than allowed for WAV files, may play truncated!\n");