attempt 1 at fixing the initial coefficient index values (nw)

This commit is contained in:
Lord-Nightmare 2015-08-14 15:28:12 -04:00
parent 6ac50ea052
commit baf82c6b82
2 changed files with 51 additions and 12 deletions

View File

@ -395,10 +395,12 @@ void tms5110_device::process(INT16 *buffer, unsigned int size)
/* loop until the buffer is full or we've stopped speaking */
while ((size > 0) && m_speaking_now)
{
/* if it is the appropriate time to update the old energy/pitch idxes,
/* if it is the appropriate time to update the old energy/pitch indices,
* i.e. when IP=7, PC=12, T=17, subcycle=2, do so. Since IP=7 PC=12 T=17
* is JUST BEFORE the transition to IP=0 PC=0 T=0 sybcycle=(0 or 1),
* which happens 4 T-cycles later), we change on the latter.*/
* which happens 4 T-cycles later), we change on the latter.
* The indices are updated here ~12 PCs before the new frame is applied.
*/
if ((m_IP == 0) && (m_PC == 0) && (m_subcycle < 2))
{
m_OLDE = (m_new_frame_energy_idx == 0);
@ -429,13 +431,32 @@ void tms5110_device::process(INT16 *buffer, unsigned int size)
#ifdef DEBUG_GENERATION
fprintf(stderr,"tms5110_process: processing frame: talk status = 0 caused by stop frame or buffer empty, halting speech.\n");
#endif
m_speaking_now = 0; // finally halt speech
goto empty;
if (m_speaking_now == 1) // we're done, set all coeffs to idle state but keep going for a bit...
{
m_new_frame_energy_idx = 0;
m_new_frame_pitch_idx = 0;
for (i = 0; i < 4; i++)
m_new_frame_k_idx[i] = 0;
for (i = 4; i < 7; i++)
m_new_frame_k_idx[i] = 0xF;
for (i = 7; i < m_coeff->num_k; i++)
m_new_frame_k_idx[i] = 0x7;
m_speaking_now = 2; // wait 8 extra interp periods before shutting down so we can interpolate everything to zero state
}
else // m_speaking_now == 2 // now we're really done.
{
m_speaking_now = 0; // finally halt speech
goto empty;
}
//m_speaking_now = 0; // finally halt speech
//goto empty;
}
/* Parse a new frame into the new_target_energy, new_target_pitch and new_target_k[] */
parse_frame();
/* Parse a new frame into the new_target_energy, new_target_pitch and new_target_k[],
* but only if we're not just about to end speech */
if (m_speaking_now == 1) parse_frame();
#ifdef DEBUG_PARSE_FRAME_DUMP
fprintf(stderr,"\n");
#endif

View File

@ -749,10 +749,12 @@ void tms5220_device::process(INT16 *buffer, unsigned int size)
/* loop until the buffer is full or we've stopped speaking */
while ((size > 0) && m_speaking_now)
{
/* if it is the appropriate time to update the old energy/pitch idxes,
/* if it is the appropriate time to update the old energy/pitch indices,
* i.e. when IP=7, PC=12, T=17, subcycle=2, do so. Since IP=7 PC=12 T=17
* is JUST BEFORE the transition to IP=0 PC=0 T=0 sybcycle=(0 or 1),
* which happens 4 T-cycles later), we change on the latter.*/
* which happens 4 T-cycles later), we change on the latter.
* The indices are updated here ~12 PCs before the new frame is applied.
*/
if ((m_IP == 0) && (m_PC == 0) && (m_subcycle < 2))
{
m_OLDE = (m_new_frame_energy_idx == 0);
@ -786,13 +788,29 @@ void tms5220_device::process(INT16 *buffer, unsigned int size)
#ifdef DEBUG_GENERATION
fprintf(stderr,"tms5220_process: processing frame: talk status = 0 caused by stop frame or buffer empty, halting speech.\n");
#endif
m_speaking_now = 0; // finally halt speech
goto empty;
if (m_speaking_now == 1) // we're done, set all coeffs to idle state but keep going for a bit...
{
m_new_frame_energy_idx = 0;
m_new_frame_pitch_idx = 0;
for (i = 0; i < 4; i++)
m_new_frame_k_idx[i] = 0;
for (i = 4; i < 7; i++)
m_new_frame_k_idx[i] = 0xF;
for (i = 7; i < m_coeff->num_k; i++)
m_new_frame_k_idx[i] = 0x7;
m_speaking_now = 2; // wait 8 extra interp periods before shutting down so we can interpolate everything to zero state
}
else // m_speaking_now == 2 // now we're really done.
{
m_speaking_now = 0; // finally halt speech
goto empty;
}
}
/* Parse a new frame into the new_target_energy, new_target_pitch and new_target_k[] */
parse_frame();
/* Parse a new frame into the new_target_energy, new_target_pitch and new_target_k[],
* but only if we're not just about to end speech */
if (m_speaking_now == 1) parse_frame();
#ifdef DEBUG_PARSE_FRAME_DUMP
fprintf(stderr,"\n");
#endif