2
* srcmgr.c -- ESS Technology allegro audio driver.
4
* Copyright (C) 1992-2000 Don Kim (don.kim@esstech.com)
9
static int num_errors = 0; /* Dummy variable used to supress lint warnings. */
13
/*/////////////////////////////////////////////////////////////////////////// */
14
/* DSP kernel support */
15
/* index 0 - 44.1k; 1 - 32k; 2 - 22.05k; 3 - 11.025k; 4 - 8k */
17
/*/////////////////////////////////////////////////////////////////////////// */
18
WORD gwSRC3_PB_SIZE_OUT[5] =
19
{ 37 * 2 * 2, 6 * 2, 37 * 2 * 2, 26 * 2, 12 * 2 };
20
WORD gwSRC3_PB_SIZE_IN[5] = { 34 * 2, 4, 17 * 2, 6, 2 };
21
WORD gwSRC3_PB_FILTER_LENGTH[5] = { 666, 60, 666, 338, 360 };
22
WORD gwSRC3_PB_FILTER_TAP_SIZE[5] = { 17, 19, 17, 25, 59 }; /* SIZE - 1 */
23
WORD gwSRC3_PB_BIG_LOOP_COUNTER[5] = { 11, 1, 5, 2, 0 };
24
WORD gwSRC3_PB_SMALL_LOOP_COUNTER[5] = { 0, 0, 1, 3, 4 };
25
WORD gwSRC3_IN_BufferSize[5] =
26
{ 2 * 17 * 16, 192 * 2, 2 * 17 * 16, 192 * 2, 192 * 2 };
27
WORD gwSRC3_OUT_BufferSize[5] =
28
{ 160 * 4, 160 * 2, 160 * 4, 160 * 2, 160 * 2 };
30
WORD gwSRC3_REC_SIZE_OUT[5] = { 34 * 2, 4, 12, 6, 2 };
31
WORD gwSRC3_REC_SIZE_IN[5] = { 37 * 2, 6, 26, 26, 12 };
32
WORD gwSRC3_REC_FILTER_LENGTH[5] = { 680, 60, 312, 156, 60 };
33
WORD gwSRC3_REC_FILTER_TAP_SIZE[5] = { 19, 29, 51, 51, 59 }; /* SIZE - 1 */
35
/* WORD gwSRC3_REC_BIG_LOOP_COUNTER[5] = { 9, 0, 4, 1, -1 }; */
36
WORD gwSRC3_REC_SMALL_LOOP_COUNTER[5] = { 0, 0, 1, 3, 4 };
37
WORD gwSRC3_REC_IN_BufferSize[5] = { 37 * 16 * 2, 32 * 6 * 2, 416, 416, 384 };
38
WORD gwSRC3_REC_OUT_BufferSize[5] =
39
{ 160 * 4, 160 * 2, 160 * 2, 160 * 2, 160 * 2 };
41
#define PB_DMA_BUFFER_SIZE 0x2400
42
#define PLAYBACK_BUFFER_SIZE PB_DMA_BUFFER_SIZE
43
/*#define WAVE_BUFFER_BLOCK_SIZE (MAXNUM_WAVE_RENDER * PLAYBACK_BUFFER_SIZE) + 0x8000 */
45
#define STREAM_TYPE_DSPSRC 1 /* high quality SRC stream */
46
#define STREAM_TYPE_DSPMSRC 2 /* general mini SRC stream */
47
#define STREAM_TYPE_NULL (( ULONG ) -1 )
49
BYTE AllocateSRCPlay = FALSE;
50
BYTE AllocateSRCRec = FALSE;
51
/* -------------------------------------------------------------------------- */
53
/* khs, for full-dupulex */
54
#define MAX_SRC_STREAMS 2
59
#define _Debug_Printf_Service(x) dprintf3((x))
62
extern PHYSICAL_ADDRESS PPhysicalAddress;
63
extern PHYSICAL_ADDRESS RPhysicalAddress;
64
extern ULONG SWTAddress;
67
#define wSPDIFVarLen (CDATA_HEADER_LEN + 10)
68
#define gwSPDIF_IN_BufferSize 192
69
/* -------------------------------------------------------------------------- */
71
#define MAXNUM_WAVE_RENDER 1
72
#define MAXNUM_WAVE_CAPTURE 1
73
#define MAXNUM_WAVE_MIXER 1
74
#define MAXNUM_WAVE_CHANNELS MAXNUM_WAVE_RENDER + MAXNUM_WAVE_CAPTURE + MAXNUM_WAVE_MIXER
77
ALLEGRO_WAVE WaveStreams[MAXNUM_WAVE_CHANNELS] = { {0} };
79
PALLEGRO_WAVE CaptureStream = NULL;
80
PALLEGRO_WAVE PlaybackStream = NULL;
81
PALLEGRO_WAVE MidiStream = NULL;
83
MBUFFER CaptureBuffer;
87
static int StreamsRunning = 0;
93
for (i = 0; i < 3; i++)
95
WaveStreams[i].PositionBeforePaused = 0;
96
WaveStreams[i].DspClientInstance = NULL;
97
WaveStreams[i].StreamType = STREAM_TYPE_NULL;
98
WaveStreams[i].State = KSSTATE_STOP;
101
WaveStreams[0].WaveType = WAVE_PLAYBACK;
102
WaveStreams[1].WaveType = WAVE_CAPTURE;
103
WaveStreams[2].WaveType = WAVE_MIXER;
106
RenderBuffer.Physical = (ULONG) PPhysicalAddress.LowPart;
107
RenderBuffer.Length = 0x2000;
108
WaveStreams[0].Buffer = &RenderBuffer;
109
WaveStreams[0].Length = RenderBuffer.Length;
111
CaptureBuffer.Physical = (ULONG) RPhysicalAddress.LowPart;
112
CaptureBuffer.Length = 0x4000;
113
WaveStreams[1].Buffer = &CaptureBuffer;
114
WaveStreams[1].Length = CaptureBuffer.Length;
116
MidiBuffer.Physical = (ULONG) SWTAddress;
117
MidiBuffer.Length = 3520;
118
WaveStreams[2].Buffer = &MidiBuffer;
119
WaveStreams[2].Length = MidiBuffer.Length;
120
WaveStreams[2].StreamType = STREAM_TYPE_DSPMSRC;
123
PlaybackStream = &WaveStreams[0];
124
CaptureStream = &WaveStreams[1];
125
MidiStream = &WaveStreams[2];
130
AllocateStream (allegro_devc * devc, IN BYTE waveType)
132
dprintf1 (("AllocateStream %d", waveType));
133
WaveStreams[waveType].DspClientInstance = NULL;
134
WaveStreams[waveType].StreamType = STREAM_TYPE_NULL;
135
WaveStreams[waveType].State = KSSTATE_STOP;
138
/* at the request of record, turn off SPDIF out if already on. */
139
/* at the end of record, turn on */
141
if ((WAVE_CAPTURE == waveType) && fSPDIFOUT)
142
HWMGR_Enable_SPDIF (devc, FALSE);
145
/* SetFormat( &WaveStreams[ waveType ], WaveInfo ); */
146
} /* AllocateStream */
149
FreeStream (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave)
151
/* close DSP instance */
152
dprintf3 (("FreeStream:%x", AllegroWave->DspClientInstance));
153
if (AllegroWave->DspClientInstance)
155
if (kCloseInstance (devc, gphwi, AllegroWave->DspClientInstance,
156
KOPENCLOSE_SYNCHRONOUS) != KRETURN_SUCCESS)
158
/*_Debug_Printf_Service( "Close Inst!\n" ); */
159
dprintf1 (("ERROR: FreeStream kCloseInstance"));
162
AllegroWave->DspClientInstance = NULL;
168
/* reset the spdif out data type to PCM */
169
HWMGR_WriteDataWord (devc, ASSP_MEMORY_PORT, DSP_DATA_MEMORY);
170
HWMGR_WriteDataWord (devc, ASSP_INDEX_PORT, KDATA_SPDIF_FRAME0);
171
HWMGR_WriteDataWord (devc, ASSP_DATA_PORT, 0x100);
174
if (STREAM_TYPE_DSPSRC == AllegroWave->StreamType)
176
AllocateSRCRec = FALSE;
177
AllocateSRCPlay = FALSE;
183
SRCMGR_Stop (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave)
185
dprintf1 (("SRCMGR_Stop: Client = %x", AllegroWave->DspClientInstance));
186
if (AllegroWave->DspClientInstance)
189
/* stop DMA transfer */
190
kStopTransfer (devc, gphwi, AllegroWave->DspClientInstance);
192
/* stop the DSP client */
193
kSetInstanceNotReady (devc, gphwi, AllegroWave->DspClientInstance);
198
SRCMGR_StartSPDIFIN (allegro_devc * devc, IN BOOLEAN start)
209
kCloseInstance (devc, gphwi, pClient_SPDIFIN,
210
KOPENCLOSE_SYNCHRONOUS);
211
pClient_SPDIFIN = NULL;
214
if (0 == StreamsRunning)
216
WRITE_PORT_USHORT (devc->osdev, devc->base + HOST_INT_CTRL,
217
(USHORT) (READ_PORT_USHORT
221
~CLKRUN_GEN_ENABLE));
225
kOpenInstance (devc, gphwi,
228
2 * (MINISRC_TMP_BUFFER_SIZE / 2 +
229
MINISRC_IN_BUFFER_SIZE / 2 + 1 +
230
MINISRC_OUT_BUFFER_SIZE / 2 + 1), &pClient_SPDIFIN);
235
if (1 == StreamsRunning)
237
WRITE_PORT_USHORT (devc->osdev, devc->base + HOST_INT_CTRL,
238
(USHORT) (READ_PORT_USHORT
245
wCC_offset = (WORD) (pClient_SPDIFIN->dwDspCodeClientArea);
246
wCD_offset = (WORD) (pClient_SPDIFIN->dwDspDataClientArea);
248
dprintf1 (("success %x %x %x", pClient_SPDIFIN, wCC_offset,
250
kStartTransfer (devc, gphwi, pClient_SPDIFIN, TRUE, 0L, 0L, 0L, 0L,
251
(ULONG) (wCD_offset + MINISRC_TMP_BUFFER_SIZE / 2),
252
(ULONG) (MINISRC_IN_BUFFER_SIZE),
253
(ULONG) (wCD_offset + MINISRC_TMP_BUFFER_SIZE / 2 +
254
MINISRC_IN_BUFFER_SIZE / 2 + 1),
255
(ULONG) (MINISRC_OUT_BUFFER_SIZE), KCONNECT_SPDIFIN,
258
/* ------------------------------------------------------------------------- */
259
/* load the coefficient starting at offset of program size in program memory */
260
/* ------------------------------------------------------------------------- */
262
/* filter length calculation */
263
FilterLength = sizeof (MINISRC_LPF) / 2;
265
for (i = 0; i < FilterLength; i++)
267
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_CODE, wCC_offset + MINISRC_COEF_LOC + i, (USHORT) (MINISRC_LPF[i])); /*since it is in sequence. */
270
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_CODE,
271
wCC_offset + MINISRC_COEF_LOC + FilterLength,
274
/*------------------------------------------------------------------------------------------- */
275
/* Transfer all parameters into DSP Data memory */
276
/* All the change below should be consistent with DSP client --- khs 04/17/98 */
277
/*------------------------------------------------------------------------------------------- */
280
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
281
wCD_offset + CDATA_LEFT_VOLUME, 0X7FFF);
284
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
285
wCD_offset + CDATA_LEFT_VOLUME + 1, 0X7FFF);
288
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA, wCD_offset + SRC3_DIRECTION_OFFSET, 0 /* playback */
292
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA, wCD_offset + SRC3_DIRECTION_OFFSET + 1, 0 /* stereo */
296
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA, wCD_offset + SRC3_DIRECTION_OFFSET + 2, 0 /* 16bit */
300
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
301
wCD_offset + SRC3_DIRECTION_OFFSET + 3, 0X0000);
304
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
305
wCD_offset + SRC3_DIRECTION_OFFSET + 4, 0);
308
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
309
wCD_offset + SRC3_DIRECTION_OFFSET + 5, 0);
312
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
313
wCD_offset + SRC3_DIRECTION_OFFSET + 6, 0);
316
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
317
wCD_offset + SRC3_DIRECTION_OFFSET + 7, 0);
320
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
321
wCD_offset + SRC3_DIRECTION_OFFSET + 8, 0);
324
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
325
wCD_offset + SRC3_DIRECTION_OFFSET + 9, 0);
328
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
329
wCD_offset + SRC3_DIRECTION_OFFSET + 10, 0X8000);
331
/* HIGHER BYTE MASK */
332
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
333
wCD_offset + SRC3_DIRECTION_OFFSET + 11, 0XFF00);
335
/* TEMPORARY INPUT BUFFER ADDRESS */
336
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
337
wCD_offset + SRC3_DIRECTION_OFFSET + 12,
338
(WORD) (wCD_offset + 40 + 8));
341
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
342
wCD_offset + SRC3_DIRECTION_OFFSET + 13, 0);
345
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
346
wCD_offset + SRC3_DIRECTION_OFFSET + 14, 0);
349
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
350
wCD_offset + SRC3_DIRECTION_OFFSET + 15, 0);
353
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
354
wCD_offset + SRC3_DIRECTION_OFFSET + 16, 8);
357
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
358
wCD_offset + SRC3_DIRECTION_OFFSET + 17, 24);
361
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
362
wCD_offset + SRC3_DIRECTION_OFFSET + 18,
363
(MINISRC_BIQUAD_STAGE - 1));
366
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
367
wCD_offset + SRC3_DIRECTION_OFFSET + 19,
368
(WORD) (wCC_offset + MINISRC_COEF_LOC));
371
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
372
wCD_offset + SRC3_DIRECTION_OFFSET + 20, 0);
375
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
376
wCD_offset + SRC3_DIRECTION_OFFSET + 21, 0);
379
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
380
wCD_offset + SRC3_DIRECTION_OFFSET + 22, 0xFF);
383
/* set the run-flag to start */
384
kSetInstanceReady (devc, gphwi, pClient_SPDIFIN);
392
/* stop DMA transfer */
393
kStopTransfer (devc, gphwi, pClient_SPDIFIN);
395
/* stop the DSP client */
396
kSetInstanceNotReady (devc, gphwi, pClient_SPDIFIN);
398
kCloseInstance (devc, gphwi, pClient_SPDIFIN,
399
KOPENCLOSE_SYNCHRONOUS);
400
pClient_SPDIFIN = NULL;
403
if (0 == StreamsRunning)
405
WRITE_PORT_USHORT (devc->osdev, devc->base + HOST_INT_CTRL,
406
(USHORT) (READ_PORT_USHORT
410
~CLKRUN_GEN_ENABLE));
415
} /* SRCMGR_StartSPDIFIN */
417
#define REAL_SHIFT 15
418
#define REAL_SCALE ( 1 << REAL_SHIFT )
421
SRCMGR_SetFrequency (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave)
425
if (AllegroWave->DspClientInstance)
427
frequency = (AllegroWave->Frequency * REAL_SCALE + 24000) / 48000;
430
kSetFrequency (devc, gphwi, AllegroWave->DspClientInstance,
433
} /* SRCMGR_SetFrequency */
436
SRCMGR_StartPlay (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave)
447
if (AllegroWave->DspClientInstance)
451
SRCMGR_SetFrequency (devc, AllegroWave);
454
(WORD) (AllegroWave->DspClientInstance->dwDspCodeClientArea);
456
(WORD) (AllegroWave->DspClientInstance->dwDspDataClientArea);
458
Length = devc->dma_dac.dmasize; /*AllegroWave->Buffer->Length; */
459
AllegroWave->Length = Length;
463
StartOffset = 0x20 * 2;
464
SizeIn = MINISRC_IN_BUFFER_SIZE - StartOffset;
465
SizeOut = MINISRC_OUT_BUFFER_SIZE + StartOffset;
466
StartOffset = wCD_offset + MINISRC_TMP_BUFFER_SIZE / 2;
468
kStartTransfer (devc, gphwi, AllegroWave->DspClientInstance, TRUE, devc->dma_dac.base, /*AllegroWave->Buffer->Physical, */
474
StartOffset + SizeIn / 2 + 1,
475
SizeOut, KCONNECT_DMA, KCONNECT_MIXER);
477
/* ------------------------------------------------------------------------- */
478
/* load the coefficient starting at offset of program size in program memory */
479
/* ------------------------------------------------------------------------- */
481
/* filter length calculation */
482
FilterLength = sizeof (MINISRC_LPF) / 2;
484
for (i = 0; i < FilterLength; i++)
486
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_CODE, wCC_offset + MINISRC_COEF_LOC + i, (USHORT) (MINISRC_LPF[i])); /*since it is in sequence. */
489
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_CODE,
490
wCC_offset + MINISRC_COEF_LOC + FilterLength,
493
/*------------------------------------------------------------------------------------------- */
494
/* Transfer all parameters into DSP Data memory */
495
/* All the change below should be consistent with DSP client --- khs 04/17/98 */
496
/*------------------------------------------------------------------------------------------- */
499
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
500
wCD_offset + CDATA_LEFT_VOLUME, 0X7FFF);
503
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
504
wCD_offset + CDATA_LEFT_VOLUME + 1, 0X7FFF);
507
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA, wCD_offset + SRC3_DIRECTION_OFFSET, 0 /* playback */
511
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
512
wCD_offset + SRC3_DIRECTION_OFFSET + 1,
513
(WORD) ! AllegroWave->FormatStereo);
516
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
517
wCD_offset + SRC3_DIRECTION_OFFSET + 2,
518
(WORD) ! AllegroWave->Format16Bit);
521
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
522
wCD_offset + SRC3_DIRECTION_OFFSET + 3, 0X0000);
525
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
526
wCD_offset + SRC3_DIRECTION_OFFSET + 4, 0);
529
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
530
wCD_offset + SRC3_DIRECTION_OFFSET + 5, 0);
533
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
534
wCD_offset + SRC3_DIRECTION_OFFSET + 6, 0);
537
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
538
wCD_offset + SRC3_DIRECTION_OFFSET + 7, 0);
541
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
542
wCD_offset + SRC3_DIRECTION_OFFSET + 8, 0);
545
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
546
wCD_offset + SRC3_DIRECTION_OFFSET + 9, 0);
549
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
550
wCD_offset + SRC3_DIRECTION_OFFSET + 10, 0X8000);
552
/* HIGHER BYTE MASK */
553
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
554
wCD_offset + SRC3_DIRECTION_OFFSET + 11, 0XFF00);
556
/* TEMPORARY INPUT BUFFER ADDRESS */
557
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
558
wCD_offset + SRC3_DIRECTION_OFFSET + 12,
559
(WORD) (wCD_offset + 40 + 8));
562
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
563
wCD_offset + SRC3_DIRECTION_OFFSET + 13, 0);
566
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
567
wCD_offset + SRC3_DIRECTION_OFFSET + 14, 0);
570
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
571
wCD_offset + SRC3_DIRECTION_OFFSET + 15, 0);
574
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
575
wCD_offset + SRC3_DIRECTION_OFFSET + 16, 8);
577
if (0 < AllegroWave->Frequency && AllegroWave->Frequency < 8000)
579
Length = 48000 * 8 / AllegroWave->Frequency;
581
/* add one more for remainder */
589
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
590
wCD_offset + SRC3_DIRECTION_OFFSET + 17,
591
(USHORT) Length * 2);
595
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
596
wCD_offset + SRC3_DIRECTION_OFFSET + 17, 50 * 2);
599
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
600
wCD_offset + SRC3_DIRECTION_OFFSET + 18,
601
(MINISRC_BIQUAD_STAGE - 1));
604
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
605
wCD_offset + SRC3_DIRECTION_OFFSET + 19,
606
(WORD) (wCC_offset + MINISRC_COEF_LOC));
609
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
610
wCD_offset + SRC3_DIRECTION_OFFSET + 20, 0);
613
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
614
wCD_offset + SRC3_DIRECTION_OFFSET + 21, 0);
617
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
618
wCD_offset + SRC3_DIRECTION_OFFSET + 22,
619
(WORD) ((AllegroWave->Frequency >
623
if (AllegroWave->PositionBeforePaused)
624
kAlterTransfer (devc, gphwi,
625
AllegroWave->DspClientInstance,
627
TRUE, AllegroWave->PositionBeforePaused);
631
kStartTransfer (devc, gphwi, AllegroWave->DspClientInstance, TRUE, devc->dma_dac.base, /*AllegroWave->Buffer->Physical, */
635
(ULONG) (wCD_offset + wSPDIFVarLen),
636
(ULONG) (gwSPDIF_IN_BufferSize),
637
(DWORD) NULL, 0, KCONNECT_DMA, 0);
639
/* only one parameter */
640
/* when you close ac3-spdif, you have to put it back with "0x100" */
641
HWMGR_WriteDataWord (devc, ASSP_MEMORY_PORT, DSP_DATA_MEMORY);
642
HWMGR_WriteDataWord (devc, ASSP_INDEX_PORT, KDATA_SPDIF_FRAME0);
643
HWMGR_WriteDataWord (devc, ASSP_DATA_PORT, 0x102); /*;0x102 -- AC3 data */
645
/*;0x100 -- pcm data */
646
/* set the run-flag to start */
647
kSetInstanceReady (devc, gphwi, AllegroWave->DspClientInstance);
649
} /* SRCMGR_StartPlay */
653
SRCMGR_StartRecord (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave)
661
if (AllegroWave->DspClientInstance)
664
SRCMGR_SetFrequency (devc, AllegroWave);
667
(WORD) (AllegroWave->DspClientInstance->dwDspDataClientArea);
669
Length = devc->dma_adc.dmasize; /*AllegroWave->Buffer->Length; */
670
AllegroWave->Length = Length;
671
StartOffset = 0x10 * 2;
672
SizeIn = MINISRC_IN_BUFFER_SIZE + StartOffset;
673
SizeOut = MINISRC_OUT_BUFFER_SIZE - StartOffset;
674
StartOffset = wCD_offset + MINISRC_TMP_BUFFER_SIZE / 2;
676
kStartTransfer (devc, gphwi, AllegroWave->DspClientInstance, TRUE, 0L, 0L, devc->dma_adc.base, /*AllegroWave->Buffer->Physical, */
680
StartOffset + SizeIn / 2 + 1,
681
SizeOut, gwDSPConnectIn, KCONNECT_DMA);
683
/*------------------------------------------------------------------------------------------- */
684
/* Transfer all parameters into DSP Data memory */
685
/* All the change below should be consistent with DSP client --- khs 04/17/98 */
686
/*------------------------------------------------------------------------------------------- */
689
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
690
wCD_offset + CDATA_LEFT_VOLUME, 0X7FFF);
693
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
694
wCD_offset + CDATA_LEFT_VOLUME + 1, 0X7FFF);
697
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA, wCD_offset + SRC3_DIRECTION_OFFSET, 1 /* recording */
701
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
702
wCD_offset + SRC3_DIRECTION_OFFSET + 1,
703
(WORD) ! AllegroWave->FormatStereo);
706
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
707
wCD_offset + SRC3_DIRECTION_OFFSET + 2,
708
(WORD) ! AllegroWave->Format16Bit);
711
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
712
wCD_offset + SRC3_DIRECTION_OFFSET + 3, 0X0000);
715
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
716
wCD_offset + SRC3_DIRECTION_OFFSET + 4, 0);
719
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
720
wCD_offset + SRC3_DIRECTION_OFFSET + 5, 0);
723
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
724
wCD_offset + SRC3_DIRECTION_OFFSET + 6, 0);
727
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
728
wCD_offset + SRC3_DIRECTION_OFFSET + 7, 0);
731
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
732
wCD_offset + SRC3_DIRECTION_OFFSET + 8, 0);
735
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
736
wCD_offset + SRC3_DIRECTION_OFFSET + 9, 0);
739
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
740
wCD_offset + SRC3_DIRECTION_OFFSET + 10, 0X8000);
742
/* HIGHER BYTE MASK */
743
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
744
wCD_offset + SRC3_DIRECTION_OFFSET + 11, 0XFF00);
746
/* TEMPORARY INPUT BUFFER ADDRESS */
747
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
748
wCD_offset + SRC3_DIRECTION_OFFSET + 12,
749
(WORD) (wCD_offset + 40 + 8));
752
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
753
wCD_offset + SRC3_DIRECTION_OFFSET + 13, 0);
756
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
757
wCD_offset + SRC3_DIRECTION_OFFSET + 14, 0);
760
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
761
wCD_offset + SRC3_DIRECTION_OFFSET + 15, 0);
763
if (0 < AllegroWave->Frequency && AllegroWave->Frequency < 8000)
765
Length = 48000 * 8 / AllegroWave->Frequency;
767
/* add one more for remainder */
775
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
776
wCD_offset + SRC3_DIRECTION_OFFSET + 16,
781
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
782
wCD_offset + SRC3_DIRECTION_OFFSET + 16, 50);
785
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
786
wCD_offset + SRC3_DIRECTION_OFFSET + 17, 8);
790
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
791
wCD_offset + SRC3_DIRECTION_OFFSET + 18, 0);
794
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
795
wCD_offset + SRC3_DIRECTION_OFFSET + 19, 0);
798
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
799
wCD_offset + SRC3_DIRECTION_OFFSET + 20, 0);
802
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
803
wCD_offset + SRC3_DIRECTION_OFFSET + 21, 0);
805
/* SKIPLPF = FF ; no LPF for any recording */
806
kDspWriteWord (devc, devc->base, MEMTYPE_INTERNAL_DATA,
807
wCD_offset + SRC3_DIRECTION_OFFSET + 22, 0xFF);
809
/* set the run-flag to start */
810
kSetInstanceReady (devc, gphwi, AllegroWave->DspClientInstance);
812
} /* SRCMGR_StartRec */
814
SRCMGR_SetVolume (allegro_devc * devc, IN PCLIENT_INST client, IN USHORT left,
825
kSetVolume (devc, gphwi, client, lvalue, rvalue, 0);
827
} /* SRCMGR_SetVolume */
830
SRCMGR_SetRearVolume (allegro_devc * devc, IN PCLIENT_INST client,
831
IN USHORT left, IN USHORT right)
841
kSetRearVolume (devc, gphwi, client, lvalue, rvalue);
843
} /* SRCMGR_SetVolume */
846
SRCMGR_SetupStream (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave)
851
AllegroWave->SR_8khzFlag = FALSE;
854
/* not using host src */
855
AllegroWave->SR_8khzFlag = TRUE;
857
if (STREAM_TYPE_NULL == AllegroWave->StreamType)
859
AllegroWave->StreamType = STREAM_TYPE_DSPSRC;
861
/* 8-bit not supported by SRC */
862
if (!AllegroWave->Format16Bit)
863
AllegroWave->StreamType = STREAM_TYPE_DSPMSRC;
867
if (AllegroWave->StreamType == STREAM_TYPE_DSPMSRC)
869
_Debug_Printf_Service ("M. SRC\r\n");
873
_Debug_Printf_Service ("SRC 3.X\r\n");
876
/* see if we can acquire a DSP client instance for the new */
877
/* requested format */
878
if (AllegroWave->StreamType == STREAM_TYPE_DSPSRC)
880
switch (AllegroWave->Frequency)
883
AllegroWave->wFreqIndex = SRC3_SR_44100;
887
AllegroWave->wFreqIndex = SRC3_SR_32000;
891
AllegroWave->wFreqIndex = SRC3_SR_22050;
894
AllegroWave->wFreqIndex = SRC3_SR_11025;
897
AllegroWave->wFreqIndex = SRC3_SR_8000;
900
AllegroWave->SR_8khzFlag = TRUE;
904
AllegroWave->StreamType = STREAM_TYPE_DSPMSRC;
909
AllegroWave->StreamType = STREAM_TYPE_DSPMSRC; /*DON */
910
dprintf1 (("SRCMGR_SetupStream Mode %d", AllegroWave->StreamType));
913
if (AllegroWave->StreamType == STREAM_TYPE_DSPMSRC)
915
_Debug_Printf_Service ("M. SRC\r\n");
919
_Debug_Printf_Service ("SRC 3.X\r\n");
923
/* ok, if it was determined we are to attempt to do a SCR stream */
924
/* we still don't know if we can so we have to see if the SRC */
925
/* manager will allow us to do it... and if so we have to try and */
926
/* get an instance from the DSP kernel, if the SRC manager didn't */
927
/* let us get it or the DSP kernel didn't allow it we defer it */
928
/* back to Mini SRC stream */
929
if (AllegroWave->StreamType == STREAM_TYPE_DSPSRC)
931
if (WAVE_CAPTURE == AllegroWave->WaveType)
936
/* Temporary Buffer Size: Two Filter Tap buffer, one block of temporary output buffer */
937
AllegroWave->wSRC3VarLen = SRC3_TEMP_OUTBUF_ADDR_OFFSET + 2
938
+ 2 * (gwSRC3_REC_FILTER_TAP_SIZE[AllegroWave->wFreqIndex] +
939
1) + 2 + gwSRC3_REC_SIZE_IN[AllegroWave->wFreqIndex] +
940
1 + gwSRC3_REC_SIZE_OUT[AllegroWave->wFreqIndex] + 1 + 1 +
943
kOpenInstance (devc, gphwi,
946
2 * (AllegroWave->wSRC3VarLen +
947
gwSRC3_REC_IN_BufferSize[AllegroWave->
950
gwSRC3_REC_OUT_BufferSize[AllegroWave->
952
1), &AllegroWave->DspClientInstance);
953
if (AllegroWave->DspClientInstance)
956
/* SRC does not support full-duplex */
958
AllocateSRCPlay = TRUE;
960
AllocateSRCRec = TRUE;
966
if (!AllocateSRCPlay)
970
/* Temporary Buffer Size: Two Filter Tap buffer, one block of temporary input/output buffer */
971
AllegroWave->wSRC3VarLen = SRC3_TEMP_OUTBUF_ADDR_OFFSET + 2
972
+ 2 * (gwSRC3_PB_FILTER_TAP_SIZE[AllegroWave->wFreqIndex] + 1)
974
+ gwSRC3_PB_SIZE_OUT[AllegroWave->wFreqIndex] + 1
975
+ gwSRC3_PB_SIZE_IN[AllegroWave->wFreqIndex] + 1
978
kOpenInstance (devc, gphwi, CLIENT_SRC, 0, 2 * (AllegroWave->wSRC3VarLen + gwSRC3_IN_BufferSize[AllegroWave->wFreqIndex] / 2 + 1 + gwSRC3_OUT_BufferSize[AllegroWave->wFreqIndex] / 2 + 1), /* word */
979
&AllegroWave->DspClientInstance);
980
dprintf3 (("kOpenIns:%x", AllegroWave->DspClientInstance));
981
if (AllegroWave->DspClientInstance)
983
AllocateSRCPlay = TRUE;
985
/* SRC does not support full-duplex */
987
AllocateSRCRec = TRUE;
992
if (!AllegroWave->DspClientInstance)
993
AllegroWave->StreamType = STREAM_TYPE_DSPMSRC;
996
if (STREAM_TYPE_DSPMSRC == AllegroWave->StreamType)
998
if (kOpenInstance (devc, gphwi,
999
IsAC3Format ? CLIENT_SPDIF : CLIENT_MINISRC,
1001
IsAC3Format ? 2 * (wSPDIFVarLen +
1002
gwSPDIF_IN_BufferSize / 2) : 2 *
1003
(MINISRC_TMP_BUFFER_SIZE / 2 +
1004
MINISRC_IN_BUFFER_SIZE / 2 + 1 +
1005
MINISRC_OUT_BUFFER_SIZE / 2 + 1),
1006
&AllegroWave->DspClientInstance) != KRETURN_SUCCESS)
1008
dprintf1 (("%x:Open M SRC Inst!\n"));
1012
} /* SRCMGR_SetupStream */
1015
SRCMGR_GetPosition (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave)
1019
ULONG BufferPosition = 0;
1022
/*dprintf1(("GetPos=%x %x %x %x", AllegroWave->State, AllegroWave->DspClientInstance, AllegroWave->Length, AllegroWave->WaveType)); */
1024
/* to make sure nothing funny happens if this stream is in stop */
1025
/* state, just return 0 */
1026
if (KSSTATE_STOP == AllegroWave->State || !AllegroWave->DspClientInstance)
1029
KeAcquireSpinLock (&gpGDI->ControlSpinLock, &OldIrql);
1031
if (WAVE_CAPTURE == AllegroWave->WaveType)
1035
/* khs 090298 for PIO recording */
1036
kPIOInterruptHandler (devc, gphwi, AllegroWave->DspClientInstance);
1038
for (i = 0; i < 100; i++)
1040
if (kQueryPosition (devc, gphwi,
1041
AllegroWave->DspClientInstance,
1042
FALSE, &BufferPosition) == KRETURN_SUCCESS)
1047
if (BufferPosition >= AllegroWave->Length)
1049
dprintf1 (("!%d ", BufferPosition));
1053
Position = BufferPosition % AllegroWave->Length;
1057
for (i = 0; i < 100; i++)
1059
if (kQueryPosition (devc, gphwi,
1060
AllegroWave->DspClientInstance,
1061
TRUE, &BufferPosition) == KRETURN_SUCCESS)
1066
if (BufferPosition >= AllegroWave->Length)
1068
dprintf1 (("!%d ", BufferPosition));
1072
Position = BufferPosition % AllegroWave->Length;
1075
KeReleaseSpinLock (&gpGDI->ControlSpinLock, OldIrql);
1082
SetFormat (allegro_devc * devc, IN PALLEGRO_WAVE AllegroWave,
1083
IN PWAVE_INFO WaveInfo)
1086
/* close previous client if it is SRC and sampling rate is different */
1087
if (AllegroWave->DspClientInstance &&
1088
STREAM_TYPE_DSPSRC == AllegroWave->StreamType &&
1089
WaveInfo->SamplesPerSec != AllegroWave->Frequency)
1091
dprintf1 (("SetFormat CloseInstance:%x",
1092
AllegroWave->DspClientInstance));
1094
(devc, gphwi, AllegroWave->DspClientInstance,
1095
KOPENCLOSE_SYNCHRONOUS) != KRETURN_SUCCESS)
1097
_Debug_Printf_Service ("Close inst!\n");
1102
if (WAVE_CAPTURE == AllegroWave->WaveType)
1103
AllocateSRCRec = FALSE;
1105
AllocateSRCPlay = FALSE;
1107
AllocateSRCPlay = FALSE;
1108
AllocateSRCRec = FALSE;
1110
AllegroWave->DspClientInstance = NULL;
1111
AllegroWave->StreamType = STREAM_TYPE_NULL;
1113
AllegroWave->FormatStereo = (WaveInfo->Channels == 2);
1114
AllegroWave->Format16Bit = (WaveInfo->BitsPerSample == 16);
1115
AllegroWave->Frequency = WaveInfo->SamplesPerSec;
1117
dprintf1 (("SetFormat:%d,%d,%d", WaveInfo->SamplesPerSec,
1118
WaveInfo->BitsPerSample, WaveInfo->Channels));
1123
SetState (allegro_devc * devc,
1124
IN PALLEGRO_WAVE AllegroWave, IN KSSTATE NewState)
1128
dprintf1 (("SetState=(%x, %x)", AllegroWave->State, NewState));
1129
KeAcquireSpinLock (&gpGDI->ControlSpinLock, &OldIrql);
1130
if (AllegroWave->State != NewState)
1137
AllegroWave->PositionBeforePaused = 0;
1138
if (KSSTATE_RUN == AllegroWave->State)
1142
if (!StreamsRunning)
1144
kSetTimer (devc, gphwi, 0);
1145
WRITE_PORT_USHORT (devc->osdev, (devc->base + 0x18),
1146
READ_PORT_USHORT (devc->osdev,
1147
(devc->base + 0x18)) &
1148
~CLKRUN_GEN_ENABLE);
1150
SRCMGR_Stop (devc, AllegroWave);
1157
/* client not opened */
1158
if (!AllegroWave->DspClientInstance)
1160
SRCMGR_SetupStream (devc, AllegroWave);
1163
/* start the transfer on whatevr method specified */
1164
switch (AllegroWave->StreamType)
1166
case STREAM_TYPE_DSPMSRC:
1167
if (WAVE_CAPTURE == AllegroWave->WaveType)
1168
SRCMGR_StartRecord (devc, AllegroWave);
1170
SRCMGR_StartPlay (devc, AllegroWave);
1176
if (1 == StreamsRunning)
1178
/* 4 ms * 12000 / 1000 */
1179
kSetTimer (devc, gphwi, 240);
1180
WRITE_PORT_USHORT (devc->osdev, (devc->base + 0x18),
1181
READ_PORT_USHORT (devc->osdev,
1182
(devc->base + 0x18)) |
1188
AllegroWave->State = NewState;
1190
KeReleaseSpinLock (&gpGDI->ControlSpinLock, OldIrql);
1197
return SRCMGR_GetPosition (devc, MidiStream);
1200
PCLIENT_INST pClient;
1201
#define DBG_TRACE dprintf1
1204
InitModem (allegro_devc * devc)
1211
wRC = kOpenInstance (devc, gphwi, CLIENT_MODEM, 0, 512 * 2 + 64, &pClient); /* HSP_Open */
1213
while ((wRC != KRETURN_SUCCESS) && (cnt++ < 100)); /* enddo */
1215
if (wRC != KRETURN_SUCCESS)
1217
DBG_TRACE (("KOpenInstance from HSP modem fail"));
1220
DBG_TRACE (("KOpenInstance from HSP modem OK"));
1222
dprintf1 (("pClient Area=%x", pClient->dwDspDataClientArea));
1223
/* setup the outbuffer address and length so Kernel can */
1224
/* move the output data to MIXER */
1230
wRC = kStartTransfer (devc, gphwi,
1239
pClient->dwDspDataClientArea + 32,
1240
128, KCONNECT_NONE, KCONNECT_MIXER);
1243
if (wRC != KRETURN_SUCCESS)
1245
DBG_TRACE (("kStartTransfer fail"));
1249
while ((wRC != KRETURN_SUCCESS) && (retry++ < 100)); /* enddo */
1252
if (wRC != KRETURN_SUCCESS)
1254
DBG_TRACE (("kStartTransfer fail"));
1255
kCloseInstance (gphwi, pClient, 0);
1256
#pragma message("----Closing client, can we handle this?")
1261
DBG_TRACE (("kStartTransfer OK"));
1280
wRC = kStopTransfer (devc, gphwi, pClient);
1282
if (wRC != KRETURN_SUCCESS)
1284
DBG_TRACE (("DSPStopXfer fail"));
1288
while ((wRC != KRETURN_SUCCESS) && (cnt++ < 100));
1293
wRC = kCloseInstance (devc, gphwi, pClient, 0);
1295
while ((wRC != KRETURN_SUCCESS) && (cnt++ < 100)); /* enddo */
1301
SRCMGR_SetPassThruVolume (allegro_devc * devc, IN PPASSTHRU client,
1302
IN USHORT left, IN USHORT right)
1310
rvalue = right >> 1;
1312
kSetPassThruVolume (devc, gphwi, client, lvalue, rvalue);
1313
dprintf3 (("kSetPassThruVolume %x %x", lvalue, rvalue));
1315
} /* SRCMGR_SetPassThruVolume */
1318
SRCMGR_SetPassThruRearVolume (allegro_devc * devc, IN PPASSTHRU client,
1319
IN USHORT left, IN USHORT right)
1327
/*LeftPassThruVolRear = left; */
1328
/*RightPassThruVolRear = right; */
1334
rvalue = right >> 1;
1336
kSetPassThruRearVolume (devc, gphwi, client, lvalue, rvalue);
1338
} /* SRCMGR_SetPassThruRearVolume */