출처 : http://kimgisa.net/241

자바에서는 unsigned 형이 없다.
0xF8 는 부호를 무시하면 248이지만, byte형에서는 부호비트가 고려되어 -8로 출력된다.

   byte b = (byte)0xF8;
   System.out.println(b);
   ----
   결과
   ----
   -8

원하는 결과를 얻기위해 이 byte형 변수 b를  int형 변수에 그냥 대입하게 되면,
역시 -248이 출력된다.

   byte b = (byte)0xF8;
   int i = b;
   System.out.println(i);
   ----
   결과
   ----
   -8


일반적인 대입의 경우 산술적인 형확장이 일어나기 때문에 부호비트가 고려되며
byte의 첫번째 비트인 부호비트는 int형으로 형확장되면서 부호가 그대로 적용된다.

원하는 결과인 248을 얻으려면 다음과 같이 하면된다.

   byte b = (byte)0xF8;
   int value = b & 0xFF;
   System.out.println(value);
   ----
   결과
   ----
   248


그러나, 비트연산의 경우는 다음과 같이 계산되어 원하는 결과를 얻을 수 있다.

0xFF : 00000000 00000000 00000000 11111111
                                                 11111000
------------------------------------------
결과 : 00000000 00000000 00000000 11111000



 


[출처] : http://cafe.naver.com/sharkjava.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=244

쿠키에서 한글 깨지는 문제 해결 
한글 문제가 해결하기 정말 어렵당.

우선 쿠키에서 한글 깨지는 문제는 이렇게 해결했습니다.

1.샘플소스

-----------------------------------------------------------

쿠키심는 부분

-----------------------------------------------------------

<%@page contentType="text/html;charset=euc-kr"%>
<%@page language="java" import="java.net.*, java.sql.*,java.lang.*,java.util.*,javax.servlet.http.*,sql.database.*"%>
<%!
String koreanDecoding(String str) throws Exception {
if (str==null)
return null;
else
return new String(str.getBytes("8859_1"),"EUC-KR");
}
%>
<%
String gubn = koreanDecoding(request.getParameter("gubn"));    // 구분값1
String sqnum = koreanDecoding(request.getParameter("sqnum"));   // 구분값2

if (request.getParameter("gubn") == null)
gubn = "";
if (request.getParameter("sqnum") == null)
sqnum = "";


// 구분값1
Cookie cookie_gubn = new Cookie("Mgubn", gubn);
cookie_gubn.setPath("/");
cookie_gubn.setMaxAge(60*60*2);
response.addCookie(cookie_gubn);

// 구분값2
Cookie cookie_sqnum = new Cookie("Msqnum", URLEncoder.encode(sqnum, "EUC-KR"));
cookie_sqnum.setPath("/");
cookie_sqnum.setMaxAge(60*60*2);
response.addCookie(cookie_sqnum);


%>



-----------------------------------------------------------

쿠키가져오는 부분

-----------------------------------------------------------

<%
Cookie [] cookie = request.getCookies();

String Mgubn = "" ;
String Msqnum = "" ;

for(int i = 0; i < cookie.length; i++)
{

  if (cookie[i].getName().equals("Mgubn")){   // 구분값1
  Mgubn = cookie[i].getValue();
}
if (cookie[i].getName().equals("Msqnum")){   // 구분값2
  Msqnum = URLDecoder.decode(cookie[i].getValue());

}
}



out.println(Mgubn);
out.println("<br>");
out.println(Msqnum);
out.println("<br>");

%>



이러면 분명히 처음에 받은 gubn, sqnum 값이 한글처리됩니다.

출처 :

http://opensource.atlassian.com/confluence/oss/display/IBATIS/Environment+Specific+Information

Environment Specific Solutions

Oracle

BLOBs/CLOBs

As of release 2.0.9, iBATIS includes default BLOB/CLOB handlers. If you are using an older version of Oracle (pre-10g), then you might have to write your own Custom Tag Handler to access the proprietary Oracle API to work with LOBs.

Some selectKey examples

<insert id="insert" parameterClass="customer">
  <selectKey resultClass="int" keyProperty="id">
    select someSequence.NEXTVAL as "id" from dual
  </selectKey>
  insert into Customer (id, name)
  values (#id#, #name#)
</insert>
An example of using selectKey with a parameterMap.
The selectKey stanza is executed and the result is used to set the property 'pkey' of the parameter object,
then the parameter map is invoked.

<insert id="insert2" parameterClass="Entity" parameterMap="insert-paramMap">
   <selectKey resultClass="int" keyProperty="pkey"> SELECT seq.nextval FROM DUAL </selectKey>
   INSERT INTO EntityTable (PKEY, DATA) VALUES (?, ?)
</insert>

LONG

I was having trouble using an Oracle LONG column with an iBatis sqlmap.  I had defined the jdbcType as a LONGVARCHAR in the sqlmap, but iBatis was still attempting to call getCLOB on the oracle jdbc driver's LongAccessor class.  The solution to this was to explicitly use the StringTypeHandler on the column, as follows:

Using the StringTypeHandler on an Oracle LONG column - attempt #1 (failed)

<result column="MY_VARCHAR_COLUMN" property="myStringProperty" jdbcType="VARCHAR" />
<result column="MY_LONG_COLUMN" property="myStringProperty2" jdbcType="LONGVARCHAR" typeHandler="com.ibatis.sqlmap.engine.type.StringTypeHandler"/>

This correctly resulted in a call to LongAccessor.getString() in the oracle jdbc driver.  However, it threw up a new problem, "Stream has already been closed". 

The solution was to change the ordering of the columns in the result map so that the LONG column was accessed first, as follows:

Using the StringTypeHandler on an Oracle LONG column - attempt #2 (succeeded)

<result column="MY_LONG_COLUMN" property="myStringProperty2" jdbcType="LONGVARCHAR" typeHandler="com.ibatis.sqlmap.engine.type.StringTypeHandler"/>
<result column="MY_VARCHAR_COLUMN" property="myStringProperty" jdbcType="VARCHAR" />

So in summary, to use an Oracle LONG column, the following worked for me:

  1. Declare the jdbcType attribute as "LONGVARCHAR" in the result map
  2. Use a typeHandler attribute of "com.ibatis.sqlmap.engine.type.StringTypeHandler"
  3. Ensure the LONG column is the first declared column in the result map.

Oracle Paging

An example of how to select a subset of an ordered list. The keys added to the parameter map over and above the abator generated ones (used by the 'Where_Clause' sql) are FIRST (0-based, hence the "+ 1") and COUNT (no of entries to return).

<select id="selectPagedIds" resultClass="int" parameterClass="java.util.Map">
 select * from (
  select a.*, ROWNUM rn from (
   select ID from Schema.MYTABLE
    <include refid="Where_Clause"/>
   order by $ABATOR_ORDER_BY_CLAUSE$) a
  WHERE ROWNUM <![CDATA[ <= ]]> (#FIRST# + #COUNT#))
 WHERE rn <![CDATA[ >= ]]> (#FIRST# + 1)
</select>

Timeout

As of release 2.2.0, iBATIS includes a query timeout funcionality.
You can specify both a global timeout

<settings defaultStatementTimeout="2" />

or a per query timeout

<statement ... timeout="2">

When the timeout expires, it throws a SQL Exception "ORA-01013 : user requested cancel of current operation".

Tested with:

  • Oracle 9i release 2 drivers.

Sybase

Stored Proc/UNCHAINED mode

By default, Sybase doesn't allow procs to be run in a transactional context. You can work around this problem a few different ways:

1. Use your own Connection and .setAutoCommit(true). Pass this connection into the SqlMapClient.setUserConnection(Connection) method. You're responsible for closing the connection afterwards. If you like, you can get the Connection from the same DataSource by calling SqlMapClient.getDataSource(). Although this seems a bit "roundabout", it works.

2. In Sybase, use the following command to change all stored procedures into proper transaction mode.

sp_procxmode <stored procedure> , "anymode"

3. Use the longer approach proposed by Scott Severtson: ["Scott's Sybase Proc Solution"]

MySQL

Transactions

Older versions of MySQL don't support transactions. Make sure you're using a modern MySQL release and the latest drivers. iBATIS won't work without Transaction support (an RDBMS without TX support is kind of silly anyway).

Some selectKey Examples

<insert id="insertFolder" parameterClass="folder">
  INSERT INTO folder (parent_id, owner, foldername)
  VALUES (#parentId#, #owner#, #foldername#)
  <selectKey resultClass="int" keyProperty="folderId">
    SELECT LAST_INSERT_ID() AS folderId
  </selectKey>
</insert>

WebSphere

Container Managed Transactions (CMT) Configuration

This transaction configuration is appropriate for WebSphere when using EJBs and container managed transactions (CMT).

<transactionManager type="EXTERNAL">
    <property name="SetAutoCommitAllowed" value="false"/>
    <dataSource type="JNDI">
        <property name="DataSource" value="java:comp/env/..."/>
    </dataSource>
  </transactionManager>

Bean Managed Transactions or Servlets Without EJBs

This transaction configuration is appropriate for WebSphere when your are using WebSphere connection pooling, but not using EJBs (servlets only). It is also appropriate when using WebSphere connection pooling, EJBs, and bean managed transactions.

<transactionManager type="JTA" commitRequired="true">
    <property name="UserTransaction" value="java:comp/env/UserTransaction"/>
    <dataSource type="JNDI">
        <property name="DataSource" value="java:comp/env/..."/>
    </dataSource>
  </transactionManager>

For more information on using WAS with iBATIS read this article on the developerworks website:
http://www-106.ibm.com/developerworks/db2/library/techarticle/dm-0502cline/

PostgreSQL

Some selectKey Examples

<insert id="insert">
    <selectKey keyProperty="accountId" resultClass="int">
      SELECT nextVal('account_accountid_seq')
    </selectKey>
    INSERT INTO Account (accountId, username, password)
    VALUES (#accountId#, #username#, #password#)
</insert>

If accountId is defined as a 'serial' column in your schema, you can allow the accountId to default to the next number in the sequence and use Postgres's currval function to retrieve the generated ID.

<insert id="insert">
    INSERT INTO Account (accountId, username, password)
    VALUES (#accountId#, #username#, #password#)
    <selectKey keyProperty="accountId" resultClass="long">
      SELECT currval('account_accountid_seq')
    </selectKey>
</insert>

DB400 (AS400 / iSeries)

Invalid Usages of the Parameter Marker ?

DB400 has some quirks about where the ? can go in the statement.   For instance, the ? cannot be "an operand of a scalar function."  This means that DB400 will complain about using functions like UPPER or TRIM. This is a quirk with using PreparedStatements, and therefore, SqlMaps.  Below is an example of how to get scalar functions to work, much like the example of using LIKE in the FAQ section.

For more info, see  http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzala/rzalaml.htm  Look for SQL code SQL0418.

<select id="company" resultMap="getCompanyInfo" parameterClass="java.lang.String">
    <!--
        The 400 does not allow ? in scalar functions, like UPPER(?).
        This means we must use $value$ instead of #value#.
        We must rely on Java to escape the value before passing it in to SqlMaps
        by using StringEscapeUtils.escapeSql(value) to avoid injection attacks.
    -->
    SELECT COID, NAME
      FROM USRCOM
     WHERE UPPER(USER) = UPPER('$value$')
     ORDER BY NAME
</select>

import java.sql.*;

public class DBTest{
 public static void main(String args[]) throws Exception{
  new DBTest();
 }
 public DBTest(){
  Connection conn=null;
  Statement stmt=null;
  ResultSet rs=null;

  String sql="select * from en_contents";
  String url = "jdbc:oracle:thin:@192.168.1.50:1521:ORCL";
  String id = "myid";
  String pass = "mypass";

  try {
   //클래스를 메모리에 로딩 시키는 것
   Class.forName("oracle.jdbc.driver.OracleDriver"); 
  } catch (Exception e) {
   e.printStackTrace();
  }
  try {
   conn= DriverManager.getConnection(url,id,pass);
   stmt = conn.createStatement();
   rs=stmt.executeQuery(sql);
   while (rs.next()) {
    System.out.println(rs.getString(1));
   }

   if(rs!=null)rs.close();
   if(stmt!=null)stmt.close();
   if(conn!=null)conn.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
}

Windows(XP, Sever...) 기준 웹서버 설치 방안 입니다.

Apache + Php + MySql
http://blog.naver.com/jjeowl?Redirect=Log&logNo=40025454157

Apache +  Svn
http://www.pyrasis.com/main/SubversionServerForWindows

Apache + Tomcat 연동
http://tong.nate.com/fish197/47313754

SVN How To Use
http://www.pyrasis.com/main/Subversion-HOWTO

WEBSVN 설치
[ SVN ]
http://websvn.tigris.org/svn/websvn/
ID : guest , PW : 없음
으로 접속하여 파일 다운로드 이후 branch내 포함된 파일을 웹에 올린 다음 아래와 같이 설정한다.

아파치의 httpd.conf 파일 수정
Alias /websvn "E:/usr/local/WebSVN/" #WEBSVN설치폴더 경로

<Directory "E:/usr/local/WebSVN/"> #WEBSVN설치폴더 경로
 Order allow,deny
 Allow from all
 Options MultiViews
 DirectoryIndex index.php
 Require valid-user
 AuthType Basic
 AuthName "Subversion repository"
 AuthUserFile D:/svnrepos/.htaccess #암호 설정화일이 있는곳 위치 경로
</Directory>

이후, include folder에 distconfig.php를 config.php로 복사해서 WebSVN에 대한 config를 다음과 같이 한다.

#환경에 맞춰 알맞게 추가 한다.
$config->addRepository('UBIP', 'http://www.xxx.co.kr/svn/웹상리포지토리경로', NULL, 'myid', 'password');
$config->parentPath('X:\\svn-win32-1.5.4\\실제SVN리포지토리경로');
$config->setInputEncoding("euc-kr");     // 커맨드라인의 charset
$config->setContentEncoding("euc-kr"); // 소스 코드의 charset

설정이 완료 되었으면 http://www.호스트.co.kr/websvn 으로 접속하여 확인한다.

WEBSVN 기타 설정
http://www.pyrasis.com/main/WebSVNPatch?action=show&redirect=WebSVN161Patch

위 링크를 모두 참조하시면 됩니다. 후후
처음에 삽질해서 나름 2틀 걸렸네욥 -_-; 이젠 파일만 준비 된다면 1시간이면 OK?! ㅋㅋ

'etc > old' 카테고리의 다른 글

ibatis에서 insert하고 id값 받기 (DB별)  (0) 2008.11.14
초간단 오라클 접속 테스트  (0) 2008.11.14
STRUTS2 - Login with Session  (1) 2008.11.04
Struts2 - Login Test with Validator  (0) 2008.11.04
Context 와 ThreadLocal  (0) 2008.10.27
세션을 이용하여 로그인 하는 방법 입니다.




참조 사이트 (약간 수정을 해서 올려요.)
http://www.roseindia.net/struts/struts2/struts2-login.shtml

'etc > old' 카테고리의 다른 글

초간단 오라클 접속 테스트  (0) 2008.11.14
웹 서버 설치 (Apache 2.2 + Tomcat 6.0 + Mysql + Svn)  (0) 2008.11.05
Struts2 - Login Test with Validator  (0) 2008.11.04
Context 와 ThreadLocal  (0) 2008.10.27
Tender Love  (0) 2008.10.21
Validator를 사용하여 입력을 점검 할 수 있습니다.


[Source Code]


'etc > old' 카테고리의 다른 글

웹 서버 설치 (Apache 2.2 + Tomcat 6.0 + Mysql + Svn)  (0) 2008.11.05
STRUTS2 - Login with Session  (1) 2008.11.04
Context 와 ThreadLocal  (0) 2008.10.27
Tender Love  (0) 2008.10.21
MP3 플레이어 만들기  (0) 2008.10.19

Web 프로그램을 구현할 때 시작시점에 디버그 플래그를 세팅하면 해당 프로그램이 수행되는 모든 지점에서 로그를 출력하려면 어떻게 해야 할까?
J2EE에서 DB와 같은 리소스를 연동하고 트랜잭션을 관리하기 위해서 J2EE에서는 Context라는 객체를 활용한다. 이러한 Contex는 리소스에 대한 위치 투명성을 제공하고 Two Phase Commit과 같은 분산 트랜잭션을 위한 기본적인 환경을 제공한다.
이러한 Context의 기능을 이용해서 작업을 추적해서 로그를 출력하는 모듈을 개발할 수 있다. 그러면 이러한 Context를 간단하게 구현하려면 어떻게 해야 할까?
이러한 문제를 해결하려면 문제를 조금 다른 관점에서 살펴보는 안목이 필요하다.
Web 프로그램은 Muiti Thread 환경에서 실행되는데 프로그램이 각각의 Thread에서 실행된다.
이러한 각각의 Thread에 변수를 저장하는 방법이 있다면 Context와 비슷한 기능을 하는 모듈을 작성할 수 있다
그리고 이러한 모듈을 활용해서 앞에서 제시한 문제를 해결할 수 있다.
그러면 어떻게 Thread에 변수를 저장할 수 있을까? 바로 java.lang.ThreadLocal이라는 Class를 활용해서 작성할 수 있다.
ThreadLocal은 각각의 Thread별로 변수를 생성할 수 있는 기능을 제공하고 또한 각각의 Thrad에서 접근할 수 있는 API를 제공해 준다. 이러한 ThreadLocal을 이용해서 Thread에 따라 구분되는 Data를 저장하고 활용할 수 있다.

아래는 간단한 ThreadLocal 예제이다.
public class ThreadLocalSample {
    public static void main(String[] args) {
        ThreadLocal local = new ThreadLocal(); 
        local.set("Thread Local변수");
        System.out.println("ThreadLocal변수 : " + local.get() );
    }
}

위와 같이 일반적인 Class와 동일하게 객체를 생성하고 값을 설정하고 읽어온다.
다만 내부적으로 Thread.currentThread()라는 함수로 현재 Thread 객체를 찾아와서 객체를 기준으로 Map에서 값을 읽어오도록 구현이 되어 있다. J2SE 1.4.1의 ThreadLocal의 get()과 set()을 살펴보면 아래와 같다.

public Object get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        return map.get(this);
    // Maps are constructed lazily.  if the map for this thread
    // doesn't exist, create it, with this ThreadLocal and its
    // initial value as its only entry.
    Object value = initialValue();
    createMap(t, value);
    return value;
}

public void set(Object value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

여기서 중요한 부분은 Thread.currentThread()를 이용하는 부분이다. 사실 Thread.currentThread() 함수를 이용하면 ThradLocal을 어렵지 않게 직접 구현할 수도 있다.

그러면 이러한 ThreadLocal을 이용해서 디버그 flag를 저장하고 읽어오는 함수를 구현해 보자.

public class DebugContext {
    // singleton 객체 생성
    private static DebugContext context = new DebugContext();
    private ThreadLocal info = new ThreadLocal();
   
    private DebugContext() {
    }
   
    // singleton객체 반환 함수
    public static DebugContext getContext() {
        return context;
    }
   
    public void setDebug( boolean debug ) {
        info.set( debug + "" );
    }
   
    public boolean getDebug() {
        return Boolean.valueOf( info.get() ).booleanValue();
    }
}

그러면 이 함수를 이용해서 로깅을 하는 함수를 구현해 보자. 로깅은 단순하게 System.out.println을 이용하겠다.

public class Logger {
    public static void printLog( String s ) {
        if( DebugContext.getContext().getDebug() ) {
            System.out.println( s );
        }
    }
}

테스트 시나리오에서 A.jsp라는 페이지에서 BizTask.getInfo()를 호출하고 BizTask.getInfo()에서는 DAO.select()라는 class를 호출한다고 가정하겠다. 이경우 A.jsp와 두개의 Class에서 출력되는 로그를 한번에 Enable/Disable하기 위해서 위에서 만든 Logger와 DebugContext를 이용해 보겠다.

A.jsp는 아래와 같다

<%
String debug = request.getParameter("debug");
if( debug != null && debug.equals("true") {
 DebugContext.getContext().setDebug( true );
} else {
 DebugContext.getContext().setDebug( false );
}

Logger.printLog( "현재 Thread에서 실행되는 모든 로그 출력 시작");
BizTask task = new BizTask();
Logger.printLog( "BizTask.getInfo() 호출 시작");
task.getInfo();
Logger.printLog( "BizTask.getInfo() 호출 완료");
Logger.printLog( "현재 Thread에서 실행되는 모든 로그 출력 종료");
DebugContext.getContext().setDebug( false ); //
Logger.printLog( "로그 테스트");
%>

BizTask.java는 아래와 같다.

public class BizTask{
 public BizTask() {
  Logger.printLog("BizTask 객체 생성");
 }
 
 public void getInfo() {
  DAO dao = new DAO();
  Logger.printLog("DAO.select() 호출 시작");
  dao.select();
  Logger.printLog("DAO.select() 호출 완료");
 }
}

DAO.java는 아래와 같다.

 public class DAO{
 public DAO() {
  Logger.printLog("DAO 객체 생성");
 }
 
 public void select() {
  Logger.printLog("DAO.select() 실행");
 }
}

A.jsp?bebug=true 라는 주소로 호출하면 아래와 같은 로그가 나오게 된다.

현재 Thread에서 실행되는 모든 로그 출력 시작
BizTask 객체 생성
BizTask.getInfo() 호출 시작
DAO 객체 생성
DAO.select() 호출 시작
DAO.select() 실행
DAO.select() 호출 완료
BizTask.getInfo() 호출 완료
현재 Thread에서 실행되는 모든 로그 출력 종료

A.jsp아래쪽에 있는 로그 테스트 라는 부분은 이미 Context에서 debug플래그가 제거되었기 때문에 출력되지 않는다. 또한 A.jsp?debug=false로 호출하면 아무런 로그도 출력되지 않는다.

이렇게 해서 Context를 구현하는 핵심 방법인 ThreadLoca을 알아보고 ThreadLocal을 이용해서 특정 Thread만 debug flag를 활성화 시키는 방법을 알아보았다. 

아마 코딩 경험이 있으신 분들은눈치 채었겠지만 ThreadLocal을 이용하는 방법은 참 다양하다. 

예를 들어 JDBC Connection을 개발자가 반환하는 것이 아니라 응용프로그램이 종료될 때 일괄로 반환해 주는 기능을 많은 Framework에서 제공하는데 이러한 기능도 ThreadLocal을 이용한다. 

'etc > old' 카테고리의 다른 글

STRUTS2 - Login with Session  (1) 2008.11.04
Struts2 - Login Test with Validator  (0) 2008.11.04
Tender Love  (0) 2008.10.21
MP3 플레이어 만들기  (0) 2008.10.19
MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13

'etc > old' 카테고리의 다른 글

Struts2 - Login Test with Validator  (0) 2008.11.04
Context 와 ThreadLocal  (0) 2008.10.27
MP3 플레이어 만들기  (0) 2008.10.19
MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13
SMTP 설정 및 메일 BEAN 만들기  (1) 2008.10.02


최근 수정일 : 2008년 10월 21일
수정 내역 : 5초 앞으로, 뒤로 추가 일시 정지 및 정지 추가, 아직은 스톱이 비정상적으로 처리되고 있음.
ID3태그 또한 제대로 가져오지 못하고 있음, 다음 추가 예정 볼륨

최근 수정일 : 2008년 10월 20일
수정 내역 : PAUSE 까지 구현

최초 작성일 : 2008년 10월 20일 계속 업데이트 됩니다. 얍얍 !





 사운드 관련 중요 클래스 소개

- Sound : 사운드 오브젝트 생성 및 MP3파일의 메타 데이터 접속을 가능하게 해준다.
- SoundChannel : 각각의 다른 채널로 불러드린 사운드의 통제 및 위치 조절
- SoundLoaderContext : 사운드에 대한 정보 관련
- SoundTransform : 사운드 볼륨 조절 관련
- SoundMixer : 전체적인 사운드 통제
- ID3Info : ID3 메타데이터 정보 반영
- Microphone : 컴퓨터에 장착된 마이크 소리를 캡춰하도록 도와준다.


 사운드 관련 BASE Source

//변수 선언
var audioLocation:String;      //음악 소스 위치
var URLReq:URLRequest;      //URL 오브젝트
var snd1:Sound;        //신규 Sound 오브젝트

audioLocation = "c:\\test.mp3";   
URLReq = new URLRequest(audioLocation);
snd1 = new Sound();

snd1.load(URLReq);  //로딩
snd1.play();             //재생


  사운드 버퍼를 사용한 경우


package{
 
 //imports
 import flash.net.URLRequest;
 import flash.media.Sound;
 import flash.media.SoundLoaderContext;
 import flash.display.Sprite;
 
 public class mp3_load extends Sprite{
  
  private var audioLocation:String; 
  private var URLReq:URLRequest;  
  private var snd1:Sound;    
  private var buffer:SoundLoaderContext; //버퍼 정의
  
  public function mp3_load(){
   audioLocation = "파일위치";
   URLReq = new URLRequest(audioLocation);
   snd1 = new Sound();
     
   buffer = new SoundLoaderContext(5000); //오디오 버퍼 생성(1초 = 1000)
   //버퍼를 사용하여 파일 로딩
   snd1.load(URLReq, buffer);   
   snd1.play(5000,2); //play(시작위치{초}, 반복회수)
  }  
 } 
}

  사운드 PAUSE 구현하기


package{
 
 //imports
 import flash.net.URLRequest;
 import flash.media.Sound;
 import flash.media.SoundLoaderContext;
 import flash.media.SoundChannel;
 import flash.display.MovieClip;
 import flash.events.KeyboardEvent;
 
 public class mp3_load extends MovieClip{
  
  private var audioLocation:String; 
  private var URLReq:URLRequest;  
  private var snd1:Sound;    
  private var buffer:SoundLoaderContext; //버퍼 정의
  private var sc:SoundChannel;
  private var pauseStatus:Boolean;
  private var playHeadPosition:Number;
  
  public function mp3_load(){
   audioLocation = "파일위치";
   URLReq = new URLRequest(audioLocation);
   snd1 = new Sound();
     
   buffer = new SoundLoaderContext(5000); //오디오 버퍼 생성(1초 = 1000)
   //버퍼를 사용하여 파일 로딩
   snd1.load(URLReq, buffer);   
   sc=snd1.play(0,1); //play(시작위치{초}, 반복회수), return SoundChannel
  }
  
  //실제 Sound에서는 Pause가 존재 하지 않음.
  //play시 SoundChannel을 확인 한 다음 처리한다.
  public function pauseSound(){
   if(pauseStatus){ //Pause유무를 구분한다.
    sc = snd1.play(playHeadPosition,1); //기존에 저장된 위치부터 재생한다.
    pauseStatus=false;
   }else{
    playHeadPosition = sc.position; //재생 위치 기록
    pauseStatus=true;
    sc.stop(); //정지
   }
  }
 } 
}


'etc > old' 카테고리의 다른 글

Context 와 ThreadLocal  (0) 2008.10.27
Tender Love  (0) 2008.10.21
MECE(Mutually Exclusively, Collectively Exhaustive)  (0) 2008.10.13
SMTP 설정 및 메일 BEAN 만들기  (1) 2008.10.02
FMS3에서 신호처리 방식  (0) 2008.10.01

+ Recent posts