diff dec_audio.c @ 1528:a444bd456fcc

ac3/spdif patch by German Gomez Garcia <german@piraos.com>
author arpi
date Wed, 15 Aug 2001 11:50:55 +0000
parents 0e9c29538a86
children 81aa2d701ae0
line wrap: on
line diff
--- a/dec_audio.c	Wed Aug 15 07:21:33 2001 +0000
+++ b/dec_audio.c	Wed Aug 15 11:50:55 2001 +0000
@@ -29,6 +29,8 @@
 
 #include "xa/xa_gsm.h"
 
+#include "ac3-iec958.h"
+
 #ifdef USE_DIRECTSHOW
 #include "loader/DirectShow/DS_AudioDec.h"
 #endif
@@ -130,6 +132,11 @@
   // Dolby AC3 audio:
   sh_audio->audio_out_minsize=4*256*6;
   break;
+case AFM_HWAC3:
+  // Dolby AC3 audio:
+  sh_audio->audio_out_minsize=4*256*6;
+  sh_audio->sample_format = AFMT_AC3;
+  break;
 case AFM_GSM:
   // MS-GSM audio codec:
   sh_audio->audio_out_minsize=4*320;
@@ -219,6 +226,28 @@
   }
   break;
 }
+case AFM_HWAC3: {
+  unsigned char *buffer;		    
+  struct hwac3info ai;
+  int len, skipped;
+  len = ds_get_packet(sh_audio->ds, &buffer);
+  if(ac3_iec958_parse_syncinfo(buffer, len, &ai, &skipped) < 0) {
+      fprintf(stderr, "AC3 stream not valid.\n");
+      driver = 0;
+      break;
+  }
+  if(ai.samplerate != 48000) {
+      fprintf(stderr, "Only 48000 Hz streams supported.\n");
+      driver = 0;
+      break;
+  }
+  sh_audio->samplerate=ai.samplerate;
+//  sh_audio->samplesize=ai.framesize;
+  sh_audio->channels=1;
+  sh_audio->i_bps=ai.bitrate*(1000/8);
+  sh_audio->ac3_frame=malloc(6144);
+  break;
+}
 case AFM_ALAW: {
   // aLaw audio codec:
   sh_audio->channels=sh_audio->wf->nChannels;
@@ -332,6 +361,12 @@
         }
         //printf("{3:%d}",avi_header.idx_pos);fflush(stdout);
         break;
+      case AFM_HWAC3: // AC3 through SPDIF
+	if(demux_read_data(sh_audio->ds,sh_audio->ac3_frame, 6144) != 6144) 
+	    break; //EOF 
+	ac3_iec958_build_burst(1536, 0x1F, 1, buf, sh_audio->ac3_frame);
+	len = 6144;
+	break;
 #ifdef USE_WIN32DLL
       case AFM_ACM:
 //        len=sh_audio->audio_out_minsize; // optimal decoded fragment size
@@ -387,6 +422,7 @@
           break;
         case AFM_ACM:
         case AFM_DSHOW:
+	case AFM_HWAC3:
           sh_audio->a_in_buffer_len=0;        // reset ACM/DShow audio buffer
           break;
         }