'iRadio'에 해당되는 글 1건

  1. 2013.08.18 adStar Internet Radio 테스트 (Web Radio) (1)
[MCU]/adStar2013. 8. 18. 02:59

adStar Internet Radio 테스트 (Web Radio)

adStar Internet Radio 테스트 (Web Radio)




adStar의 가장큰 장점은 칩내부에 16MB의 SDRAM이 내장되어 있어 대량 메모리가 필요한 곳에 아주 유용하다. 

특히 인터넷 라디오와 같이 스트림 데이터는 네트웍 상황에 따라 전송율이 변화기 때문에 메모리를 이용해 버퍼링이 필요하다. 

adStar의 SDRAM을 이용하여 버퍼링 하는 예제로 인터넷 라디오를 제작 해 보았다.


보드는 기존 이더넷(W5100), MP3(VS1053), MCU(adStar)모듈들을 재활용 할 수 있는 확장 테스트 보드를 이용했다. 이더넷은 W5100을 이용하여 고속의 이더넷 전송이 가능하도록 했다. 물론 STM32와 같은 Cortex-M3를 사용해도 되지만 버퍼링을 확실히 할수 있는 메모리를 갖추고 저렴하면서 소형인 adStar를 이용하기로 했다. 테스트 결과 최장 15분정도의 버퍼링도 가능했다.




인터넷 라디오는 ICY프로토콜을 이용한다. Shoutcast Server 에 접속하여 HTTP프로토콜을 이용해 Request를 보내면 그에 따른 응답이 오고 이후 MP3데이터를 수신할 수 있다. 예를 들어 URL (sc03.saycast.com)에 접쇽하려면 우선 DNS에 접속하여 IP와 포트번호를  알아낸다. IP 를 알아 냈다면 TCP로 접속한 후 GET 명령을 보내면 서버에서 이에 따른 응답이 온다.



Request 메시지

아래와 같이 GET메지지를 전송하면 응답 메시지가 날아온다. 사실 "GET / HTTP/1.0"  "Host : ip" 만 보내면 된다.

GET sc03.saycast.com HTTP/1.0
User-Agent: GOMA mpg123/1.15.1
Host: 211.43.215.141
Accept:audio/mpeg, audio/x-mpeg, audio/mp3, audio/x-mp3, audio/mpeg3, audio/x-mpeg3, audio/mpg, audio/x-mpg, audio/x-mpegaudio, application/octet-stream, audio/mpegurl, audio/mpeg-url, audio/x-mpegurl, audio/x-scpls, audio/scpls, application/pls, application/x-scpls, */*
Icy-MetaData: 1

Connection: close




응답 메시지

"ICY 200  OK"가 전송되면 정상적으로 접속이 된것이고 이후에 MP3데이터가 출력된다. 물론 곡 정보나 전송률등의 메타데이터도 함께 전송된다.

ICY 200 OK
content-type:audio/mpeg
icy-br:128
icy-genre:뮤직카페
icy-metaint:16384
icy-name:《 М 4 Ц 》 ‥ ───‥ http://m4ucast.co.kr ⌒∇⌒γ
icy-notice1:<BR>This stream requires <a href="http://www.saycast.com/">SayRadio</a><BR>
icy-notice2:SayCast Distributed Network Audio Server/Linux v2.0.0<BR>
icy-pub:1

icy-url:http://saycast.sayclub.com/saycast/gateway/winamp?domainid=m4u




MP3데이터를 받으면 VS1053의 데이터 버퍼에 쓰면 되는데 인터넷 속도에 따라 버퍼링이 필요하기 때문에 adStar의 SDAM을 이용해 저장하고 적절한 버퍼링이 되면 출력 하도록 했다.


SDRAM에 메모리 할당

#define RINGBUFFER_SIZE (4096*1024)


//SDRAM에 버퍼 메모리 할당

m_RxBuffer.buffer = malloc(RINGBUFFER_SIZE);




수신된 internet radio MP3 데이터 처리

//수신되 데이터 링버퍼에 저장

void Copy_to_StreamBuffer(u16 len, u8 *tmp_buffer)

{

u16 i;


for ( i = 0; i < len; i++)

{

SetRingBuffer(&m_RxBuffer, tmp_buffer[i]);

}

}


//저장된 MP3 데이터 출력 함수

void Push_to_VS1053(void)

{

u32 remain_bytes;

remain_bytes = GetDataSize(&m_RxBuffer);


if(remain_bytes == 0)

{

Enable_Play = 0;

}

        else if (remain_bytes > BUFFERING_SIZE)

                // buffering

Enable_Play = 1;

}

        //데이터 출력

if (Enable_Play == 1)

{

if(IsVs1053DataReady())

{

VS_WriteData(GetRingBuffer(&m_RxBuffer));

}

}

:

}






테스트 동영상

간단한 인터넷 라디오를 제작하기 위해 우선 몇개의 인터넷 라디오 사이트를 저장해 두고 스위치를 누름에 따라 각각의 서버에 접속해 라디오를 출력하는 예제를 작성해 보았다.







 

인터넷 라디오 TCP 처리 함수

인터넷 라디오의 이더넷 처리 부분은 아래와 같이 구현이 가능하다.

void ProcessiRadio(unsigned int sock, unsigned int port)

{

int len;

u8 tmp_buffer[MAX_BUF_SIZE];

switch (getSn_SR(sock))

{

case SOCK_ESTABLISHED:

//데이터 수신 검사

if (state == -1)

{

//Request 전송

SendProbe();

state = 0;

}

else if (state == 0)

{

//HTTP Request 전송

SendRequest();

DebugPrint("\r\nSend HTTP request\r\n");


state = 1;

}

else if (state == 1)

{

//응답 메시지 분석

if (ParseReply(sock) > 0) 

{

state = 2;

}

}

else if (state == 2)

{

//MP3 데이터 버퍼링

if ((len = getSn_RX_RSR(sock)) > 0) 

{

len = recv(sock, tmp_buffer, len);

Copy_to_StreamBuffer(len, tmp_buffer);

gTotalWriteCount += len;

}

}

break;

case SOCK_CLOSE_WAIT:                          

//If the client request to close

disconnect(sock);

m_SokStatus1 = 0;

break;

case SOCK_CLOSED:

if(!m_SokStatus1)m_SokStatus1 = 1;


if (getSn_RX_RSR(sock) > 0)

{

       DebugPrint("\r\nParse_Reply2"); 

 Parse_Reply(SOCK_CLIENT);

      }

    

     close(SOCK_CLIENT);


//URL일 경우 DNS 접속

if (Need_DNS(Server_URL, strlen(Server_URL)) == 1) 

{

if (dns_query(Server_URL) != -1)

{

DebugPrint("\r\nDNS ok");


//얻어온 IP 및 포트로 접속

init_socket(sock, Config_Msg.Sip, Config_Msg.Sport);

}else 

{

DebugPrint("\r\nDNS Fail");

}

}

else

{

//IP일 경우 

init_socket(sock, Config_Msg.Sip, Config_Msg.Sport);

}

break;


    default:

        break;

}

}


 

 

결론

기존에도 인너넷 라디오를 제작해 보았지만 네트웍 상황에 따라 끊기는 현상이 발생하는데 메모리 가격 때문에 상용 제품 형태로 제작하기에는 문제가 많았다. 저렴한 가격에 메모리가 포함된 adStar를 이용하면 이러한 문제점들을 해결할 수 있을것 같다. 좀더 다듬으면 훌륭한 인터넷 라디오를 제작할 수 있을것 같다.

Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2013.08.24 03:51 [ ADDR : EDIT/ DEL : REPLY ]