Author: sayer
Date: 2010-02-23 16:24:05 +0100 (Tue, 23 Feb 2010)
New Revision: 1627

Modified:
   trunk/core/AmAudioFile.cpp
Log:
fixes loop problem with mp3 files reported by Robert Szokovacs

Modified: trunk/core/AmAudioFile.cpp
===================================================================
--- trunk/core/AmAudioFile.cpp  2009-12-07 16:40:04 UTC (rev 1626)
+++ trunk/core/AmAudioFile.cpp  2010-02-23 15:24:05 UTC (rev 1627)
@@ -354,31 +354,48 @@
   long fpos  = ftell(fp);
   if(data_size < 0 || fpos - begin < data_size){
     
-    if((data_size > 0) && (fpos - begin + (int)size > data_size)){
+    if((data_size > 0) && (fpos - begin + (int)size > data_size)) {
+      // last block to read
       s = data_size - fpos + begin;
     }
     
-    s = fread((void*)((unsigned char*)samples),1,s,fp);
+    if ((data_size == -1) && loop.get() && feof(fp)) {
+      // data size unknown, loop and eof
+      DBG("rewinding audio file...\n");
+      rewind();
+      goto read_block;
+    }
+
+    if (data_size == -1 && autorewind.get() && feof(fp)) {
+      // data size unknown, autorewind and eof      
+      DBG("autorewinding audio file...\n");
+      rewind();
+
+      ret = -2; // eof
+    } else {
+      // read from file
+      s = fread((void*)((unsigned char*)samples),1,s,fp);
     
-    ret = (!ferror(fp) ? s : -1);
-    
+      ret = (!ferror(fp) ? s : -1);
+    }
+
 #if (defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN))
 #define bswap_16(A)  ((((u_int16_t)(A) & 0xff00) >> 8) | \
                      (((u_int16_t)(A) & 0x00ff) << 8))
     
     unsigned int i;
     for(i=0;i<=size/2;i++) {
-      ((u_int16_t *)((unsigned char*)samples))[i]=bswap_16(((u_int16_t 
*)((unsigned char*)samples))[i]);
+      ((u_int16_t *)((unsigned char*)samples))[i]=
+       bswap_16(((u_int16_t *)((unsigned char*)samples))[i]);
     }
     
 #endif
-  }
-  else {
-    if(loop.get() && data_size>0){
+  } else {
+    if (loop.get() && data_size>0) {
       DBG("rewinding audio file...\n");
       rewind();
       goto read_block;
-      }
+    }
 
     if (autorewind.get() && data_size>0){
       DBG("autorewinding audio file...\n");

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to