Skip to content

[URH-19] useSound 신규 #37

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 6, 2024
Merged

[URH-19] useSound 신규 #37

merged 1 commit into from
Aug 6, 2024

Conversation

Choozii
Copy link
Member

@Choozii Choozii commented Aug 2, 2024

👾 Pull Request

  • 상태: 신규

1️⃣ Spec

  • 오디오를 관리해주는 Hook
    • play, pause, stop, 반복 재생 설정, 재생 위치 설정, 볼륨 설정, 배속 설정 함수 리턴
    • 오디오가 준비되었는지, 현재 볼륨, 반복 재생인지, 일시 정지 여부, 재생 여부, 오디오 길이, 현재 재생 위치 리턴

2️⃣ 변경 사항

3️⃣ 예시 코드

import useSound from './hooks/useSound';

const App = () => {
  const result = useSound({
    url: 'https://github.com/rafaelreis-hotmart/Audio-Sample-files/raw/master/sample.mp3',
  });

  const {
    volume,
    playbackRate,
    isLoop,
    duration,
    currentTime,
    play,
    pause,
    stop,
    setIsLoop,
    setPosition,
    setVolume,
    setPlaybackRate,
  } = result;

  const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setVolume(parseFloat(e.target.value));
  };

  const handlePlaybackRateChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setPlaybackRate(parseFloat(e.target.value));
  };

  const handlePositionChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setPosition(parseFloat(e.target.value));
  };

  return (
    <div>
      <button onClick={play}>재생</button>
      <button onClick={pause}>일시정지</button>
      <button onClick={stop}>정지</button>
      <div>
        <label>
          볼륨:
          <input
            type="range"
            min="0"
            max="1"
            step="0.01"
            value={volume}
            onChange={handleVolumeChange}
          />
        </label>
      </div>
      <div>
        <label>
          배속:
          <input
            type="range"
            min="0.5"
            max="2"
            step="0.1"
            value={playbackRate}
            onChange={handlePlaybackRateChange}
          />
        </label>
      </div>
      <div>
        <label>
          재생 위치:
          <input
            type="range"
            min="0"
            max={duration}
            step="0.1"
            value={currentTime}
            onChange={handlePositionChange}
          />
        </label>
      </div>
      <div>
        <label>
          반복 재생:
          <input
            type="checkbox"
            checked={isLoop}
            onChange={(e) => setIsLoop(e.target.checked)}
          />
        </label>
      </div>
    </div>
  );
};

export default App;

4️⃣ 관련 문서 (선택 사항)

@Choozii Choozii self-assigned this Aug 2, 2024
@Choozii Choozii requested review from foresec and jeongbaebang August 2, 2024 07:10
Copy link
Collaborator

@foresec foresec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 노래 듣는 걸 참 좋아하는데요 그래서 이런 audio관련 훅이 더 반가운것 같습니다!

이미 많은 기능을 제공하고 있는 훅이지만.. 코드 리뷰를 하기 전에 빠르게 기능 추가를 제안드리고 싶어 먼저 코멘트를 남겨봅니다.

  1. 용도가 음악재생일 경우, 02:20 / 3:52와 같은 형태로 활용할 수 있도록 현재재생시간, 전체재생시간을 제공
  2. 용도가 bgm재생일 경우, 음소거를 켜고 끄는 기능을 따로 제공
  3. 다른 용도 ETC...

이 useSound훅을 어느 정도의 범위를 염두에 두고 만드셨나요? 일단 이렇게 제가 생각한 범위에서 필요한 기능을 더 제안드리고 싶습니다. 특히 음소거의 경우 용도가 음악재생이든, BGM이든 추가됐을 때 유용하게 쓰일 수 있는 기능이라고 생각합니다

Copy link
Member

@jeongbaebang jeongbaebang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 👍

@Choozii
Copy link
Member Author

Choozii commented Aug 3, 2024

저도 노래 듣는 걸 참 좋아하는데요 그래서 이런 audio관련 훅이 더 반가운것 같습니다!

이미 많은 기능을 제공하고 있는 훅이지만.. 코드 리뷰를 하기 전에 빠르게 기능 추가를 제안드리고 싶어 먼저 코멘트를 남겨봅니다.

  1. 용도가 음악재생일 경우, 02:20 / 3:52와 같은 형태로 활용할 수 있도록 현재재생시간, 전체재생시간을 제공
  2. 용도가 bgm재생일 경우, 음소거를 켜고 끄는 기능을 따로 제공
  3. 다른 용도 ETC...

이 useSound훅을 어느 정도의 범위를 염두에 두고 만드셨나요? 일단 이렇게 제가 생각한 범위에서 필요한 기능을 더 제안드리고 싶습니다. 특히 음소거의 경우 용도가 음악재생이든, BGM이든 추가됐을 때 유용하게 쓰일 수 있는 기능이라고 생각합니다

  1. 용도가 음악재생일 경우, 02:20 / 3:52와 같은 형태로 활용할 수 있도록 현재재생시간, 전체재생시간을 제공 -> 해당 건은 currentTime(현재 재생 위치)이랑 duration(음원 총 길이)로 나타낼 수 있을것 같아요!
  2. 음소거를 켜고 끄는 기능을 따로 제공 -> 음소거! 는 생각못했는데 추가해볼게요!!! 의견 감사합니당!

@foresec
Copy link
Collaborator

foresec commented Aug 3, 2024

  1. 용도가 음악재생일 경우, 02:20 / 3:52와 같은 형태로 활용할 수 있도록 현재재생시간, 전체재생시간을 제공 -> 해당 건은 currentTime(현재 재생 위치)이랑 duration(음원 총 길이)로 나타낼 수 있을것 같아요!

이부분은 00:00형식으로 포맷팅된 형식을 제공하면 간편하게 사용할 수 있지 않을까 했는데 다시 생각해보니 띄어쓰기라던가 포맷팅쪽은 자유롭게 두는게 더 나을 것 같네요😊

+) 앗 그리고 또 하나 생각났는데 autoplay를 boolean값으로 내려줘서 바로 시작할 수 있게끔 하는 기능을 추가하는것은 어떨까요? 하지만 필수적인 기능은 아니기 때문에 원하시는대로 하셔도 좋을 것 같아요
++) 좀 더 찾아보니 브라우저의 자동 재생 정책상 자동 재생 방지 기능(단, 음소거시 작동은 함)이 동작한다고 하네요. 이 부분은 넘어가는게 좋겠네요..
📃미디어 엘리먼트 자동재생

Copy link
Member

@bicochan bicochan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

멋져요 지예 님!

코딩컨벤션 내용 댓글 달았습니다. 확인 부탁드려요!

@Choozii Choozii requested a review from bicochan August 6, 2024 01:38
✨ feat: useSound 타입 추가

✨ feat: useSound 테스트 코드 추가

✨ feat: volume, playbackrate 유효성 검사 추가

✨ feat: 다양한 format에 대해 테스트 코드 추가

✨ feat: 오디오 파일 로드 에러 처리

✨ feat: state들을 reducer로 관리하도록 처리

✨ feat: setValidRange 함수 warning 문구 변경

✨ feat: optional chaining으로 함수 호출

📝 docs: jsDoc 수정

✨ feat: 음소거 기능 추가

✨ feat: isMuted 리턴하도록 추가

🔨 refactor: 코드 정리

🐛 fix: currentTime은 setupAudioElement에서 제거

🩹 chore: 코딩컨벤션에 맞게 수정

✨ feat: 테스트 코드 추가
@Choozii Choozii merged commit 58d2d75 into master Aug 6, 2024
@Choozii Choozii deleted the URH-19/use-sound branch August 6, 2024 13:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants