Sau khi xem xung quanh trang web này và meta (ví dụ, ở đây và đây ), tôi giả sử câu hỏi này có chủ đề ở đây (nhưng hãy cho tôi biết nếu không phải vậy)
Tôi đang sử dụng chip Bluetooth CSR8675 với ADK4.0.1 (Bộ phát triển âm thanh; bộ phần mềm phù hợp để lập trình chip âm thanh CSR)
(chip sẽ được sử dụng để kết nối với các thiết bị khác bằng bluetooth, nhưng vấn đề cụ thể này không phải là về bluetooth)
Chương trình mẫu của CSR cho thấy cách thực hiện kết nối trực tiếp giữa nguồn âm thanh và phần chìm, nhưng tôi muốn thực hiện kết nối gián tiếp (để hiểu rõ hơn về kích thước và tổ chức của bộ đệm liên quan khi sao chép dữ liệu âm thanh từ nguồn sang phần chìm)
Đây là sửa đổi tôi đã thực hiện cho mã mẫu của họ:
/*
Copyright (c) 2006 - 2015 Qualcomm Technologies International, Ltd.
An example app for routing audio through the Kalimba DSP from ADC to DAC
*/
#include <kalimba.h>
#include <kalimba_standard_messages.h>
#include <file.h>
#include <string.h>
#include <panic.h>
#include <source.h>
#include <sink.h>
#include <stream.h>
#include <connection.h>
#include <micbias.h>
#include <pio.h>
#include <stdio.h>
#include <transform.h>
void PioSetPio (uint16 pPIO , bool pOnOrOff);
/* Select Amp PIO depending on board used. If not defined, assume the CNS10001v4 board is assumed. */
#ifdef H13179V2
#define POWER_AMP_PIO 14
#else /* Assume CNS10001v4 */
#define POWER_AMP_PIO 4
#endif
/* Define the macro "BYPASS_KALIMBA" to bypass Kalimba DSP otherwise direct ADC->DAC */
/* #define BYPASS_KALIMBA */
/* Define the macro "MIC_INPUT" for microphone input otherwise line-in input */
#define MIC_INPUT
/* Location of DSP kap file in the file system */
static const char kal[] = "my_first_dsp_app_kalimba/my_first_dsp_app_kalimba.kap";
uint16 sampleRate = 48000;
void start_kalimba(void);
/* void connect_streams(void); */
static TaskData aud_data_inp;
void aud_inp_handler(Task task, MessageId id, Message message);
Source audSrc_L;
Sink audSink_L;
uint16 offset_aud_inp;
uint8* dest_aud_inp;
uint16 length_aud_inp;
uint16 srcSize;
const uint8* audSrcData_L;
uint16 length;
#define ENABLE_MAIN_C_PRINTFx
#ifdef ENABLE_MAIN_C_PRINTF
#define MAIN_C_MYPRINTF(x) printf x
#else
#define MAIN_C_MYPRINTF(x) /* */
#endif
Transform t1, t2, t3;
/* Main VM routine */
int main(void)
{
/* Load the Kalimba */
/* start_kalimba(); */
aud_data_inp.handler = aud_inp_handler;
audSrc_L = StreamAudioSource( AUDIO_HARDWARE_CODEC, AUDIO_INSTANCE_0, AUDIO_CHANNEL_A ); /* ORIGINAL */
PanicNull(audSrc_L);
PanicFalse( SourceConfigure(audSrc_L, STREAM_CODEC_INPUT_RATE, sampleRate) );
PanicFalse( SourceConfigure(audSrc_L, STREAM_CODEC_MIC_INPUT_GAIN_ENABLE, 1) ); /* ORIGINALLY USED: 1 */
PanicFalse(MicbiasConfigure(MIC_BIAS_0, MIC_BIAS_ENABLE, MIC_BIAS_FORCE_ON));
PanicFalse( SourceConfigure(audSrc_L, STREAM_CODEC_INPUT_GAIN, 10) ); /* ORIGINALLY USED: 10 */
PioSetPio(POWER_AMP_PIO, TRUE);
audSink_L = StreamAudioSink( AUDIO_HARDWARE_CODEC, AUDIO_INSTANCE_0, AUDIO_CHANNEL_A ); /* ORIGINAL */
PanicNull(audSink_L);
PanicFalse( SinkConfigure(audSink_L, STREAM_CODEC_OUTPUT_RATE, sampleRate) );
PanicFalse( SinkConfigure(audSink_L, STREAM_CODEC_OUTPUT_GAIN, 15) ); /* ORIGINALLY USED: 15 */
#if 1
/* BLOCK (1) */
/* printf("Transconf res = 0x%x\n", TransformConfigure(t1, VM_TRANSFORM_CHUNK_CHUNK_SIZE, 1) ); */
t1 = TransformChunk(audSrc_L, audSink_L);
/* printf("t1 = 0x%x\n", (unsigned int)t1 ); */
TransformConfigure(t1, VM_TRANSFORM_CHUNK_CHUNK_SIZE, 1);
/* printf("Transconf res = 0x%x\n", TransformConfigure(t1, VM_TRANSFORM_CHUNK_CHUNK_SIZE, 1) ); */
TransformStart( t1 );
MessageSinkTask(audSink_L, &aud_data_inp);
MessageSinkTask(StreamSinkFromSource(audSrc_L), &aud_data_inp);
#endif
/* PanicFalse( StreamConnect(audSrc_L, audSink_L) ); */
/* Connect up the ADCs and DACS */
/* connect_streams(); */
/* Start the Kalimba */
/* PanicFalse( KalimbaSendMessage(KALIMBA_MSG_GO,0,0,0,0) ); */
/* Remain in MessageLoop (handles messages) */
MessageLoop();
return 0;
}
void start_kalimba(void)
{
/* Find the codec file in the file system */
FILE_INDEX index = FileFind( FILE_ROOT, (const char *)kal, strlen(kal) );
/* Did we find the desired file? */
PanicFalse( index != FILE_NONE );
/* Load the codec into Kalimba */
PanicFalse( KalimbaLoad( index ) );
}
void PioSetPio (uint16 pPIO , bool pOnOrOff)
{
uint16 lPinVals = 0 ;
uint16 lWhichPin = (1<< pPIO) ;
if ( pOnOrOff )
{
lPinVals = lWhichPin ;
}
else
{
lPinVals = 0x0000;/*clr the corresponding bit*/
}
/*(mask,bits) setting bit to a '1' sets the corresponding port as an output*/
PioSetDir32( lWhichPin , lWhichPin );
/*set the value of the pin*/
PioSet32 ( lWhichPin , lPinVals ) ;
}
#if 1
/* original app handler */
void aud_inp_handler(Task task, MessageId id, Message message){
task = task;
MAIN_C_MYPRINTF(("\nENTERED aud_inp_handler() HANDLER\n"));
switch(id){
case MESSAGE_MORE_DATA:
MAIN_C_MYPRINTF(("Received MESSAGE_MORE_DATA Message in aud_inp_handler()\n"));
srcSize = SourceSize( audSrc_L );
MAIN_C_MYPRINTF(("srcSize = %d ( aud_inp_handler() )\n", srcSize));
audSrcData_L = SourceMap(audSrc_L);
if( srcSize == 0 || srcSize < 128) break; /* srcSize == 0 -> invalid source */
else if( srcSize == 128){
MAIN_C_MYPRINTF(("Inside else if( srcSize == 64){\n" ));
length = srcSize;
offset_aud_inp = SinkClaim(audSink_L, length);
if(offset_aud_inp == 0xFFFF) Panic(); /* Space not available; this is a memory error, should not happen */
/* Map the sink into memory space */
dest_aud_inp = SinkMap(audSink_L);
(void) PanicNull(dest_aud_inp);
/* Copy the string into the claimed space */
memcpy(dest_aud_inp+offset_aud_inp, audSrcData_L, length);
/* Flush the data out to the uart */
PanicZero(SinkFlush(audSink_L, length)); /* L_Src -> kalSink(0) */
/* Source can be dropped after sending all the data in source to the sink */
SourceDrop(audSrc_L, srcSize);
}
break;
case MESSAGE_MORE_SPACE:
break;
default:
MAIN_C_MYPRINTF(("Ignored Message in aud_inp_handler()\n"));
break;
}
}
#endif
Tôi đã thử cả bật và tắt khối mã /* BLOCK (1) */
với cùng một kết quả
Nếu tôi kích hoạt kết nối trực tiếp bằng cách bật đường truyền /* PanicFalse( StreamConnect(audSrc_L, audSink_L) ); */
thì âm thanh từ nguồn đến chìm sẽ được định tuyến mà không gặp sự cố nào
Làm cách nào tôi có thể thiết lập kết nối gián tiếp (được quản lý) nguồn và chìm trong trường hợp này? Tôi đã giả định rằng khi dữ liệu âm thanh có sẵn tại nguồn, phần sụn sẽ tạo ra MESSAGE_MORE_DATA
và điều khiển chương trình sẽ chuyển vào aud_inp_handler()
, nhưng điều đó không xảy ra. Tôi nên chỉ ra rằng khi tôi sử dụng StreamConnect()
để kết nối nguồn và chìm với nhau, nhưng chấm dứt mạnh mẽ kết nối này, phần sụn sẽ tạo ra một MESSAGE_STREAM_DISCONNECT
thông báo, được aud_inp_handler()
chức năng này nắm bắt , do đó, chính chức năng đã được đăng ký đúng cách để phát hiện các thông báo phần sụn, dẫn đến Tôi tin rằng âm thanh không đến từ phần cứng âm thanh đến bộ đệm nguồn âm thanh ở nơi đầu tiên.
Làm cách nào tôi có thể thiết lập kết nối gián tiếp (được quản lý) nguồn và chìm ở đây?