Index: /libreplaygain/include/replaygain/gain_analysis.h
===================================================================
--- /libreplaygain/include/replaygain/gain_analysis.h	(revision 411)
+++ /libreplaygain/include/replaygain/gain_analysis.h	(revision 412)
@@ -70,4 +70,8 @@
 /// right_samples NULL, and make sure num_channels = 1.
 
+Float_t gain_get_chapter ( void );
+/// will return the recommended dB level change for all samples analyzed
+/// SINCE THE LAST TIME you called gain_get_chapter() OR gain_init_analysis() OR gain_get_title.
+
 Float_t gain_get_title ( void );
 /// will return the recommended dB level change for all samples analyzed
Index: /libreplaygain/src/gain_analysis.c
===================================================================
--- /libreplaygain/src/gain_analysis.c	(revision 411)
+++ /libreplaygain/src/gain_analysis.c	(revision 412)
@@ -65,9 +65,10 @@
 #define MAX_SAMP_FREQ   48000.          // maximum allowed sample frequency [Hz]
 #define RMS_WINDOW_TIME     0.050       // Time slice size [s]
-#define STEPS_per_dB      100.          // Table entries per dB
-#define MAX_dB            120.          // Table entries for 0...MAX_dB (normal max. values are 70...80 dB)
+#define STEPS_per_dB      100           // Table entries per dB
+#define MAX_dB            120           // Table entries for 0...MAX_dB (normal max. values are 70...80 dB)
 
 #define MAX_ORDER               (BUTTER_ORDER > YULE_ORDER ? BUTTER_ORDER : YULE_ORDER)
 #define MAX_SAMPLES_PER_WINDOW  (size_t) (MAX_SAMP_FREQ * RMS_WINDOW_TIME)      // max. Samples per Time slice
+#define ANALYZE_SIZE			(STEPS_per_dB * MAX_dB)
 #define PINK_REF                64.82 //298640883795                              // calibration value
 
@@ -90,6 +91,8 @@
 static int      freqindex;
 static int      first;
-static Uint32_t A [(size_t)(STEPS_per_dB * MAX_dB)];
-static Uint32_t B [(size_t)(STEPS_per_dB * MAX_dB)];
+static int		chap_void;	// if == 0 gain_analyze_samples as been called
+static Uint32_t A [ANALYZE_SIZE];	// chapter
+static Uint32_t B [ANALYZE_SIZE];	// title
+static Uint32_t C [ANALYZE_SIZE];	// album
 
 // for each filter:
@@ -236,4 +239,6 @@
 
     memset ( B, 0, sizeof(B) );
+	memset ( C, 0, sizeof(C) );
+	chap_void = 1;
 
     return INIT_GAIN_ANALYSIS_OK;
@@ -349,5 +354,5 @@
             int     ival = (int) val;
             if ( ival <                     0 ) ival = 0;
-            if ( ival >= (int)(sizeof(A)/sizeof(*A)) ) ival = sizeof(A)/sizeof(*A) - 1;
+			if ( ival >= ANALYZE_SIZE ) ival = ANALYZE_SIZE - 1;
             A [ival]++;
             lsum = rsum = 0.;
@@ -371,4 +376,5 @@
         memcpy  ( rinprebuf, right_samples + num_samples - MAX_ORDER, MAX_ORDER * sizeof(Float_t) );
     }
+	chap_void = 0;
 
     return GAIN_ANALYSIS_OK;
@@ -400,12 +406,12 @@
 
 Float_t
-gain_get_title ( void )
+gain_get_chapter ( void )
 {
     Float_t  retval;
     int    i;
 
-    retval = analyzeResult ( A, sizeof(A)/sizeof(*A) );
-
-    for ( i = 0; i < (int)(sizeof(A)/sizeof(*A)); i++ ) {
+	retval = analyzeResult ( A, ANALYZE_SIZE );
+
+	for ( i = 0; i < ANALYZE_SIZE; i++ ) {
         B[i] += A[i];
         A[i]  = 0;
@@ -417,5 +423,25 @@
     totsamp = 0;
     lsum    = rsum = 0.;
+	chap_void = 1;
     return retval;
+}
+
+Float_t
+gain_get_title ( void )
+{
+	Float_t  retval;
+	int    i;
+	
+	if (chap_void == 0)
+		gain_get_chapter();
+	
+	retval = analyzeResult ( B, ANALYZE_SIZE );
+	
+	for ( i = 0; i < ANALYZE_SIZE; i++ ) {
+		C[i] += B[i];
+		B[i]  = 0;
+	}
+	
+	return retval;
 }
 
@@ -424,5 +450,5 @@
 gain_get_album ( void )
 {
-    return analyzeResult ( B, sizeof(B)/sizeof(*B) );
+	return analyzeResult ( C, ANALYZE_SIZE );
 }
 
